perm filename SW[SW,BGB] blob sn#062494 filedate 1973-09-18 generic text, type T, neo UTF8
00100	COMMENT ⊗   VALID 00022 PAGES 
00200	RECORD PAGE   DESCRIPTION
00300	 00001 00001	   VALID 00022 PAGES 
00400	 00007 00002		TITLE	SW	SPACE WAR PROGRAM FOR STANFORD A.I. PROJECT
00500	 00013 00003		SUBTTL	ONCE-ONLY INITIALIZATION
00600	 00018 00004		SUBTTL	THE PDP-10 SPACE WAR MODULE
00700	 00021 00005		SUBTTL	CREATE STARS AND WON COUNTS
00800	 00025 00006		SUBTTL	INITIALIZE THE NEXT MATCH
00900	 00028 00007		SUBTTL	THE PDP-6 SPACE WAR MODULE
01000	 00037 00008		SUBTTL	THE MINE CALCULATIONS
01100	 00043 00009		SUBTTL	LAUNCH A TORPEDO
01200	 00049 00010		SUBTTL	XDRAW AND DRAW
01300	 00055 00011		SUBTTL	SIN, COS AND SQRT
01400	 00057 00012		SUBTTL	GRAV:	CALCULATE SHIP POSITION
01500	 00061 00013		SUBTTL	SHIP - TORPEDO AND SHIP - MINE COLISION
01600	 00068 00014	JS:	DZM	JSTB				ZERO TABLE BEGINNING
01700	 00070 00015		SUBTTL	INSERT LOSER INTO NEW HYPERSPACE
01800	 00072 00016		SUBTTL	CODE FOR RUNTIME PARAMETER MODIFICATION
01900	 00076 00017	GETNAM:	ZAC	B,			ZERO B. WE ACCUMULATE RADIX 50
02000	 00084 00018		SUBTTL	TABLES FOR THE PARAMETER MODIFICATION
02100	 00087 00019		SUBTTL	DATA STORAGE FOR SPACEWAR
02200	 00098 00020		SUBTTL	ONCE ONLY SET PARAMETERS AT STARTUP
02300	 00103 00021		SUBTTL	MORE ONCE ONLY
02400	 00104 00022		SUBTTL	CONSTANTS
02500	 00106 ENDMK
02600	⊗;
     

00100		TITLE	SW	SPACE WAR PROGRAM FOR STANFORD A.I. PROJECT
00200		SUBTTL	DEFINITIONS
00300	
00400	COMMENT/
00500		REVISED SEPTEMBER 5,1971 R.E. GORIN
00600			FEB 1972	R TAYLOR 
00700	
00800		THIS PROGRAM IS BASED UPON A TRADITIONAL PROGRAM WRITTEN FOR
00900	THE PDP-1. ANY RESEMBLENCE TO OTHER PROGRAMS, LIVING OR DEAD, IS
01000	PURELY COINCIDENTAL
01100	
01200	/
01300	
01400	IFDEF FOR,<MACRO←←0;>MACRO==1		;SELECT ASSEMBLER
01500	
01600	IFE MACRO,<
01700		DEFINE DEF(A,B)<
01800		A←B>
01900		DEFINE SDEF(A,B)<
02000		A←←B>
02100	>
02200	IFG MACRO,<
02300		DEFINE DEF(A,B)<
02400		A=B>
02500		DEFINE SDEF(A,B)<
02600		A==B>
02700	>
02800		DEF(F,0)
02900		DEF(A,1)
03000		DEF(B,2)
03100		DEF(C,3)
03200		DEF(D,4)
03300		DEF(W,5)
03400		DEF(X,6)
03500		DEF(Y,7)
03600		DEF(SHIP,10)
03700		DEF(R11,11)
03800		DEF(R12,12)
03900		DEF(BFP,13)
04000		DEF(R14,14)
04100		DEF(R15,15)
04200		DEF(R16,16)
04300		DEF(P,17)
04400	
04500		SDEF(VBRT,4000)			;LVW BRIGHTNESS FIELD
04600		SDEF(VSIZ,1000)			;LVW SIZE FIELD
04700		SDEF(VABS,100)			;LVW ABSOLUTE FIELD
04800		SDEF(VENDP,20)			;LVW ENDPOINT FIELD
04900		SDEF(VINVIS,40)			;LVW INVISIBLE FIELD
05000	
05100	
05200	;	SWITCHES
05300		SDEF(FAST,1)			;SET FOR FAST ACTION
05400		SDEF(HYPERS,0)			;SET FOR HYPERSSPACE
05500		SDEF(NHYP,1)			;SET FOR NEW HYPERSPACE
05600		IFG NHYP,<	SDEF(HYPERS,0)	;CAN'T HAVE BOTH>
05700		SDEF(NMINE,4)			;SET TO THE MAXIMUM NUMBER OF MINES
05800		SDEF(NSHIP,5)			;SET FOR NUMBER OF SHIPS
05900		SDEF(PARM,1)			;FOR RUN TIME PARAMETER MODIFICATION
06000		SDEF(TEAMS,1)			;ON FOR TEAM SCORING
06100		IFL NSHIP-4,<	SDEF(TEAMS,0)	> ;TEAM SCORE ONLY FOR ≥4 SHIPS
06200		SDEF(GALAX,1)			;SET TO SHOW GALAXY'S SCORE
06300	
06400	;	PARAMETERS
06500	
06600		SDEF(PDLEN,10)			;PUSHDOWN LENGTH
06700		SDEF(NTORPM,40)			;MAXIMUM NUMBER OF TORPEDOES/PLAYER
06800		SDEF(LTBL,NSHIP*22)		;TORPEDO TABLE LENGTH
06900						;SEE COMMENT BELOW
07000		SDEF(NSTAR,144)			;NUMBER OF STARS TO PUT OUT
07100	
07200	
07300		DEFINE	LVW(X,Y,TYPE,MODE,BRT,SIZ)<
07400		IFIDN <MODE><a>,<SDEF(MD,1);>SDEF(MD,0)
07500		IFIDN <TYPE><i>,<SDEF(TT,2);>SDEF(TT,0)
07600		IFIDN <BRT><>,<SDEF(BQ,0);>SDEF(BQ,BRT)
07700		IFIDN <SIZ><>,<SDEF(SQ,0);>SDEF(SQ,SIZ)
07800		BYTE(11)<X>,<Y>(3)BQ,SQ(2)MD,TT(4)6
07900	>
08000	
08100	
08200	COMMENT/
08300	A LONG VECTOR WORD (LVW) FOR THE III DISPLAY HAS THE FOLLOWING FORMAT
08400	
08500	BITS  0-10	X	COORDINATE
08600	BITS 11-21	Y	COORDINATE
08700	BITS 22-24	BRT	BRIGHTNESS. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
08800	BITS 25-27	SIZ	SIZE. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
08900	BIT     29	M	MODE. 0=RELATIVE TO LAST, 1=ABSOLUTE FROM CENTER
09000	BITS 30-31	T	TYPE. 0=VISIBLE, 1=ENDPOINT, 2=INVISIBLE
09100	BITS 32-35		6.  DENOTES LVW IN DISPLAY PROCESSOR
09200	
09300	/
09400	
09500	;	OPDEFS
09600	
09700	OPDEF	UPGIOT	[703B8]			;DISPLAY A PIECE OF GLASS
09800	OPDEF	SPCWAR	[CALLI	400000]		;READ SW BUTTONS
09900	OPDEF	SPCWGO	[CALLI	400003]		;INITIATE A SPACE WAR MODULE
10000	OPDEF	EIOTM	[CALLI	400005]		;ENTER IOT USER MODE
10100	OPDEF	LIOTM	[CALLI	400006]		;LEAVE IOT USER MODE
10200	OPDEF	DISMIS	[CALLI	400024]		;DISMISS SW MODULE
10300	OPDEF	RESET	[CALLI	0]		;IO AND SW RESET
10400	OPDEF	SLEEP	[CALLI	31]		;SLEEP UUO
10500	OPDEF	CORE	[CALLI	11]		;CORE UUO
10600	OPDEF	EXIT	[CALLI	12]		;STOP MY JOB
10700	OPDEF	TTCALL	[51B8]			;TELETYPE IO
10800	
10900	COMMENT/
11000	SPCWGO:
11100	SET AC = XWD BITS,,ADR
11200		ADR IS THE ADDRESS OF THE SW MODULE
11300		BITS IS:
11400		BIT 0 = RUN THIS ON THE PDP-10
11500		BIT 1 = RUN THIS ON THE PDP-6
11600		BITS 14-17 = NUMBER OF TICKS BETWEEN STARTUPS
11700	
11800	UPGIOT:
11900	AC = PIECE OF GLASS NUMBER.
12000	ADDRESS IS FOR A TWO WORD BLOCK
12100		WORD0:	ADDRESS OF DPY PROGRAM
12200		WORD1:	LENGTH OF DPY PROGRAM
12300		PROGRAM IS RUN ON THE PIECE OF GLASS NAMED
12400	/
12500	
12600	COMMENT $	REGARDING THE SPACE ALLOWED FOR CERTAIN THINGS:
12700	
12800	1.	THE NUMBER OF TORPEDOES THAT A SHIP CAN HAVE ACTIVE
12900		IS BOUNDED BY 2+2*[TLIFE/TRELOD].
13000	
13100	2.	ASSUMING THAT TLIFE ≤ 200 AND TRELOD ≥ 20 THEN
13200		EACH SHIP CAN HAVE < 18. TORPEDOES ACTIVE.
13300	
13400	3.	THEREFORE, LTBL = 18 * NSHIP
13500	
13600	4.	EACH SHIP MUST BE ≤ 150 (OCTAL) POINTS, INCLUDING FLAME
13700	
13800	5.	MINES ARE USUALLY 2 DPY WORDS. IN CASE OF EXPLOSION,
13900		THEY ARE 10. WORDS.
14000	
14100	6.	THE MAIN BUFFER LENGTH, THEREFORE IS GIVEN BY THE EXPRESSION:
14200	
14300		1+12*NMINE+150*NSHIP+LTBL
14400	$
14500	
14600		DEF(BUFLEN,1+12*NMINE+150*NSHIP+LTBL)
14700	
14800		EXTERN	JOBREL,JOBFF,JOBDDT
     

00100		SUBTTL	ONCE-ONLY INITIALIZATION
00200	STRT:	RESET				;RESET SPACEWAR
00300		MOVEI	1,DISTAB
00400		DAC	1,137			;SAVE POINTER TO DATA
00500		LAC	P,PDP			;GET A PDL
00600		PUSHJ	P,SETP			;SET ALL THE PARAMETERS
00700		TTCALL	3,[BYTE(7)14,14,14,15]	;CLEAR SCREEN
00800		SETO	A,			;SET FOR THIS JOB'S LINE
00900		TTCALL	6,A			;GET OUR LINE NUMBER
01000		CAR	A,A			;WIPE OUT ALL BUT THE NUMBER
01100		CAIG	A,25			;SKIP IF NOT A III
01200		CAIGE	A,20			;SKIP IF A DPY
01300		EXIT				;THIS FOOL'S NOT AT A III
01400		SUBI	A,20			;NORMALIZE
01500		TRO	A,100			;TURN ON A BIT
01600		DAC	A,LINE			;SAVE AS OUR LINE NUMBER
01700		LAC	A,TRELOD		;GET THE RELOAD TIME
01800		LSH	A,-1			;HALVE IT
01900		SKIPN	TUBES			;SKIP IF WE HAVE TWO TUBES
02000		DAC	A,LATNCY		;SAVE AS LATENCY TIME
02100		MOVEI	SHIP,0			;FOR ALL SHIPS
02200		MOVEI	BFP,CNTTBL		;ADDRESS OF COUNT TABLE
02300		PUSH	BFP,GLOC		;POINTER TO GALAXY COUNT LOCATOR
02400		PUSH	BFP,[<ASCII/ />+1]	;GALAXY SCORE
02500	STRT0:	PUSH	BFP,COUNTP(SHIP)	;LVW TO POSITION COUNT
02600		PUSH	BFP,[<ASCII/ />+1]	;INITIAL TEXT
02700		DZM	ZOWSW(SHIP)		;SET INITIALLY TO NEUTRAL
02800		DZM	NUMWN(SHIP)		;AND NO WINS
02900		CAMGE	SHIP,NSHIPX		;DONE ENOUGH?
03000		AOJA	SHIP,STRT0		;NO: LOOP
03100		MOVSI	R11,-200		;CREATE -COS,,SIN TABLE
03200		SETZB	SHIP,GALAXY		;SIN/COS FOR 0 TO 2π, 200(OCTAL) STEPS
03300	STRT1:	LAC	A,SHIP			;GET THE ARGUMENT
03400		PUSHJ	P,COS			;GET THE COSINE
03500		FIX	A,200000		;CONVERT TO INTEGER
03600		MOVNM	A,TAB(R11)		;SAVE IN THE TABLE
03700		LAC	A,SHIP			;GET THE SAME ARGUMENT
03800		PUSHJ	P,SIN			;GET THE SINE
03900		FIX	A,200000		;FIX IT
04000		HLRM	A,TAB(R11)		;SAVE IT
04100		FAD	SHIP,[0.049087]		;2π/128
04200		AOBJN	R11,STRT1		;LOOP FOR MORE
04300		MOVSI	A,1000			;THIS HACK FIXES THE ONE ENTRY
04400		DAC	A,TAB+100		;IN THE TABLE THAT LOSES OTHERWISE
04500		SETOM	QRSTRT			;SET TO INITIALIZE A GAME
04600		SKIPE	TENSW			;DO WE USE THE 10 ONLY?
04700		GO	PDP10G			;YES. INITIATE SW MODULE
04800		SKIPE	DEBUG			;ARE WE DEBUGGING
04900		GO	SW6GO			;YES: DON'T START SPACE WAR MODULE
05000		SETOM	SIXSW			;CORE CELL FOR PDP6 STATUS
05100		LAC	A,[XWD 400000,ONETIK]	;ONE TICK TO DISCOVER PDP6 STATE
05200		SPCWGO A,			;RUN IN PDP-10 SW MODE FOR ONE TICK.
05300		SKIPGE	SIXSW			;WAIT FOR SW TICK TO HAPPEN
05400		GO	.-1			;KEEP WAITING
05500		SKIPE	SIXSW			;OK.  IS PDP-6 ALIVE?
05600		GO	PDP10G			;NO: RUN EVERYTHING ON THE PDP-10
05700		LAC	A,[XWD	200003,SW6GO]	;THREE TICK SERVICE ON THE PDP-6
05800		SPCWGO	A,			;REQUEST SERVICE
05900		LAC	A,[XWD	400002,SW10GO]	;TWO TICK SERVICE ON THE PDP-10
06000		GO	PDP10H			;REQUEST USUAL SERVICE ON PDP-10
06100	PDP10G:	SETOM	TENSW			;FLAG TO SAY USE THE 10 ONLY
06200		LAC	A,[XWD	400003,SW6GO]	;RUN EVERYTHING FROM PDP10
06300	PDP10H:	SPCWGO	A,			;SET UP MODULE
06400	IFE PARM,<
06500		MOVEI	A,2			;GO INTO A SLEEP LOOP
06600		SLEEP	A,			;SNOOZE
06700		GO	.-2			;AND SNOOZE MORE
06800	>
06900	IFG PARM,<
07000		DZM	LPARM			;ZERO LAST PARM CELL
07100	PARMS:	LAC	P,UPDL			;LOAD USER MODE PDL
07200		PUSHJ	P,RPARM			;READ PARAMETERS
07300		GO	PARMS			;LOOP
07400	>
07500	ONETIK:	MOVMM	5,SIXSW			;0 ⊃ OK, 1 ⊃ PDP6 SICK
07600		DISMIS				;DISMIS THE SW JOB.
07700	SETP:	SKIPE	CLOBR			;HAS HI CORE BEEN CLOBBERED?
07800		POPJ	P,			;YES. CAN'T CHANGE ANYTHING
07900		GO	SETALL			;NO. WE CAN SET ALL THE STUFF
     

00100		SUBTTL	THE PDP-10 SPACE WAR MODULE
00200	SW10GO:	SKIPN	SIXDON			;SKIP IF PDP-6 IS READY
00300		GO	NORUN1			;NOT READY. DON'T RUN THIS MODULE.
00400		DZM	SIXDON			;ZERO PDP-6 FLAG
00500		SKIPN	DDSW
00600		GO	SW10G1			;DON'T READ KEYBOARD
00700		SKIPE	DEBUG			;ARE WE AT USER MODE
00800		EIOTM				;YES, ENTER IOT USER MODE
00900		DATAO	310,LINE		;SELECT KEYBOARD NUMBER
01000		DATAI	310,A			;READ THE BITS FROM HIS LINE
01100		TRC	A,1700
01200		DAC	A,BITS
01300		SKIPE	DEBUG			;IF DEBUGGING THEN LEAVE IOT MODE
01400		LIOTM				;LEAVE IOT MODE
01500	SW10G1:	GO	3,@[.+1]		;JUMP AND SET USER
01600		SKIPN	STARFG			;ARE THE STARS OUT YET?
01700		GO	SW10ST			;STARS DONE ALREADY
01800		SOSGE	A,CDOWN			;ARE WE DONE WITH COUNT DOWN?
01900		GO	ST.NOW			;YES. TIME TO SHOW THE STARS
02000		LSH	A,-2			;DIVIDE BY 8
02100		IORI	A,141			;MAKE INTO A DIGIT WITH LSB
02200		DAC	A,CTIM			;SAVE IT
02300		LAC	A,SELWRD
02400		DAC	A,CTIM1
02500		UPGIOT	10,CTIME		;DISPLAY
02600		UPGIOT	11,CTIME
02700		GO	SW10ST			;SKIP DISPLAY OF STARS
02800	ST.NOW:	UPGIOT	10,STADR		;TIME TO DRAW THEM.
02900		DZM	STARFG			;TELL PDP-6 THAT STARS ARE OUT
03000	SW10ST:	AOSN	SHIPFG			;MUST WE DRAW THE SHIPS?
03100		UPGIOT	11,BPTRX		;YUP
03200		AOSN	CNTFG			;TIME TO SHOW NEW COUNTS?
03300		UPGIOT	12,CNTPNT		;DISPLAY THEM
03400	SW10DN:	SETOM	TENDON			;SET TO INDICATE THE TEN HAS FINISHED.
03500	NORUN1:	SKIPN	TENSW
03600		SKIPE	DEBUG			;ARE WE DEBUGGING?
03700	CPOPJ:	POPJ	P,			;YES RETURN.
03800		DISMIS				;NO DEBUGGING: DISMISS SW
03900	
     

00100		SUBTTL	CREATE STARS AND WON COUNTS
00200	STARS:	LAC	A,RCONST		;INITIALIZE RANDOM NUMBERS
00300		LAC	D,RANDX			;LOAD OLD RANDOM THING
00400		MOVEI	W,NSTAR-1		;NUMBER OF STARS TO MAKE
00500	SL1:	ADD	D,A			;MAKE A RANDOM NUMBER
00600		LAC	C,A			;SAVE IT IN C
00700		ADD	A,D			;MAKE ANOTHER RANDOM NUMBER
00800		PUSHJ	P,PLT1			;CONVERT C TO LVW COORDINATES
00900		IORI	C,526			;TURN ON END POINT AND LVW BITS SIZ=1
01000		DPB	A,[POINT 3,C,24]	;DEPOSIT A RANDOM BRIGHTNESS
01100		DAC 	C,STARBF(W)		;STUFF THIS IN THE STAR TABLE
01200		SOJGE	W,SL1			;BACK UNTIL THE TABLE IS FULL
01300		DAC	A,RANDX			;SAVE UPDATED NUMBER FOR NEXT TIME
01400		SETOM	STARFG			;SEND OUT STARS
01500		MOVEI	A,60
01600		DAC	A,CDOWN
01700		LAC	A,NSHIPX		;FOR ALL SHIPS,
01800		SKIPN	ZOWSW(A)		;DID HE LOSE?
01900		SOJGE	A,.-1			;LOOK FOR ONE LOSER
02000		JUMPL	A,CNT4			;NO LOSERS
02100		LAC	A,NSHIPX		;COMPUTE SCORES AT RESTART
02200		LAC	B,SURBEN		;SURVIVORS BENEFIT
02300	CNT3:	SKIPN	ZOWSW(A)		;SKIP IF THIS GUY LOST
02400		ADDM	B,NUMWN(A)		;WINNER, INCREASE HIS SCORE.
02500		SOJGE	A,CNT3			;LOOP
02600	CNT4:	LAC	B,NSHIPX		;UPDATE ALL SCORES
02700	CNT5:	LAC	C,NUMWN(B)		;LOAD A SCORE
02800		SKIPN	DOTEAM			;REALLY DOING TEAMS?
02900		GO	CNT5A			;NOPE
03000		ADD	C,NUMWN-1(B)		;GET THE OTHER GUY'S SCORE
03100		SUBI	B,1			;DECREMENT B AN EXTRA TIME
03200	CNT5A:	LAC	W,B
03300		LSH	W,1
03400		ADD	W,[POINT 7,CNTTBL+4]	;ADD IN THE BYTE POINTER
03500		PUSHJ	P,DECDPX		;WRITE SCORES
03600		SOJGE	B,CNT5			;LOOP
03700	CNT6:	LAC	C,GALAXY		;GET OVERHEAD COUNT
03800		LAC	W,[POINT 7,CNTTBL+2]	;TEXT POINTER
03900		PUSHJ	P,DECDPX		;COUNT GALATIC OVERHEAD
04000		LAC	B,NSHIPX		;COMPUTE LENGTH OF COUNT TABLE
04100		LSH	B,1
04200		ADDI	B,5
04300		SKIPN	GSCORE
04400		SUBI	B,2			;NO GALATIC SCORE
04500		DAC	B,CNTPNT+1		;SAVE AS LENGTH TO DISPLAY
04600		MOVEI	B,CNTTBL		;GET TABLE ADDRESS
04700		SKIPN	GSCORE
04800		ADDI	B,2			;POINT PAST GALAXY SCORE
04900		DAC	B,CNTPNT		;SET POINTER
05000		SKIPE	CNTR			;SKIP IF NO COUNTS
05100		SETOM	CNTFG			;ANNOUNCE THAT COUNTS ARE THERE
05200		POPJ	P,			;RETURN TO GAME
05300	DECDPX:	MOVEI	D,1			;SET TEXT BIT
05400		DAC	D,(W)			;IN THE WORD
05500		JUMPGE	C,DECDPB		;GO PRINT
05600		MOVEI	D,"-"			;IF THIS IS EVER NEEDED
05700		IDPB	D,W			;WE'LL HAVE IT
05800		MOVM	C,C			;GET ABS C
05900	DECDPB:	IDIVI	C,12			;ROUTINE USED TO DISPLAY THE
06000		HRLM	D,(P)			;WIN COUNTS
06100		JUMPE	C,.+2			;THIS SAVES DIGITS ON THE STACK
06200		PUSHJ	P,DECDPB		;BY WIPING THE FLAGS
06300		CDR	D,(P)			;WHICH IS FASTER THAN PUSHIMG
06400		ADDI	D,"0"			;THIS DEPOSITS TEXT USING
06500		IDPB	D,W			;W. ASSUMES LESS THAN 5 CHARACTERS
06600		POPJ	P,			;IN DECIMAL EXPANSION
     

00100		SUBTTL	INITIALIZE THE NEXT MATCH
00200		
00300	GAME:	PUSHJ	P,STARS			;MAKE THE STARS COME OUT
00400		SETZB	A,GOBEG			;ZERO STUFF FOR NEW PLAY
00500		LAC	B,[XWD GOBEG,GOBEG+1]	;LOAD A BLT POINTER
00600		BLT	B,GOEND			;ZERO THROUGH HERE
00700		SETOM	MINSTR			;MAKE THE MINES GET MADE
00800		LAC	SHIP,NSHIPX		;FOR EVERY SHIP,...
00900	GAME1:	PUSHJ	P,GAME2			;INITIALIZE A SHIP
01000		SOJGE	SHIP,GAME1		;LOOP
01100		POPJ	P,			;RETURN
01200	GAME2:	LAC	B,NTORPS		;GET TORPEDO COUNT
01300		LAC	C,NSHIPX		;RESET EVERYONE'S TORP COUNT
01400		DAC	B,TPCN(C)		;SET TORPEDO COUNT
01500		SOJGE	C,.-1			;LOOP
01600		SKIPN	RSPSWT			;DO WE WANT RANDOM START
01700		GO	STDPSS			;NO USE STANDARD
01800		LAC	C,RCONST		
01900		LAC	D,C
02000		ADDB	C,RANDX			;GET A RANDOM NUMBER
02100		ADDB	D,RANDX			;ANOTHER ONE
02200		ANDI	D,177			;A DIRECTION
02300		MOVSM	D,SRA(SHIP)		;SHIP ROTATION
02400		ROT	C,-12			;WANT MORE RANDOMNESS HERE
02500		TSC	C,C			;AND YET MORE
02600		ADD	C,D			;AND STILL MORE
02700		ANDI	C,177			;GET A DIRECTION
02800		LAC	C,TAB(C)		;GET MULTIPLIER
02900		IMULI	C,240			;LAC THE GUY
03000		DAC	C,SP(SHIP)		;SAVE SHIP POS
03100		GO	PUTSTF			;GO DO REST
03200	STDPSS:	LAC	C,IROT(SHIP)		;GET INITIAL ORIENTATION
03300		MOVSM	C,SRA(SHIP)		;SAVE
03400		LAC	C,IPOS(SHIP)		;GET INITIAL POSITION
03500		DAC	C,SP(SHIP)		;SAVE SHIP POSITION
03600	PUTSTF:	HLRE	D,C			;GET -2Y INTO D
03700		HRRE	C,C			;2X IN C
03800		FSC	C,223			;FLOAT POSITIONS
03900		FSC	D,223			;FLOAT POSITIONS
04000		DAC	C,SX(SHIP)		;SAVE X POSITION
04100		MOVNM	D,SY(SHIP)		;SAVE --Y POSITION
04200		LAC	C,ALLBIT(SHIP)
04300		ANDCAM	C,DMASK			;INITIALIZE DAMAGE MASK
04400		DZM	ZOWSW(SHIP)		;SHIP NOT EXPLODED
04500		DZM	HYPER(SHIP)		;NOT IN HYPER SPACE
04600		DZM	TCNT0(SHIP)		;TUBE 0 READY NOW
04700		DZM	TCNT1(SHIP)		;TUBE 1 READY NOW
04800		DZM	UTUBE(SHIP)		;TUBE 0 UP NEXT
04900		DZM	SV(SHIP)		;NO VELOCITY
05000		DZM	SVX(SHIP)		;...
05100		DZM	SVY(SHIP)		;...
05200		DZM	ZORCHP(SHIP)		;ZORCH IS UNBEGUN
05300		DZM	HYPCNT(SHIP)		;RESET HYPERSPACE COUNT
05400		POPJ	P,			;RETURN
     

00100		SUBTTL	THE PDP-6 SPACE WAR MODULE
00200	SW6GO:	LAC	P,PDP			;GET A PDL
00300		SKIPE	DEBUG
00400		SPCWAR	A,			;READ BUTTONS IF NOT SPACEWAR
00500		TRC A,2		;AS OF 27 JAN 73, THIS BIT IS INVERTED (BECAUSE OF A N.O. SWITCH).
00600		DAC	A,SWBUT			;SAVE SW BUTTON
00700		SKIPN	TENSW
00800		SKIPE	DEBUG			;ARE WE ON THE PDP-10
00900		PUSHJ	P,SW10GO		;YES: FAKE THE 10 SW MODULE
01000		LAC	B,TENDON		;IS PDP-10 READY?
01100		JUMPE	B,NORUN2		;NOT YET. HOLD THIS UP
01200		DZM	TENDON			;CLEAR PDP-10 FLAG
01300		LAC	A,SWBUT			;GET BUTTONS INTO A
01400		SKIPN	DDSW
01500		GO	SW6GO1
01600		LSH	A,14			;SHIFT SW BITS 8 PLACES
01700		CAR	B,BITS			;GET LINE BITS
01800		TRZ	B,770000		;SHUT OFF SPURIOUS BITS
01900		IOR	A,B			;OR THE BUTTON BITS WITH SW BITS
02000	SW6GO1:	AOSN	QRSTRT			;TEST THE RESTART FLAG
02100		PUSHJ	P,GAME			;TIME FOR A NEW GAME
02200		SKIPN	STARFG			;ARE THE STARS OUT YET
02300		GO	SWG1			;YES, ALL OK
02400	
02500	NORUN2:	SETOM	SIXDON			;TELL PDP-10 WE ARE READY
02600		SKIPE	DEBUG			;ARE WE DEBUGGING?
02700		GO	SW6GO			;YES: WE'LL SOON FORCE THE STARS
02800		DISMIS				;NO. INTERLOCK WITH PDP-10
02900						;UNTIL HE FINISHES WITH STABLE
03000	SWG1:	LAC	SHIP,NSHIPX		;SHUT OFF BITS FROM ANYONE ZAPPED
03100	SWG1.1:
03200	IFN NHYP,<				;COMPILE FOR NEW HYPER SPACE
03300		SKIPLE	HYPER(SHIP)		;IF IN NEW HYPERSPACE
03400		TDZ	A,ALLBIT(SHIP)		;ZERO ALL HIS BITS
03500	>
03600		SKIPN	ZOWSW(SHIP)		;EXPLODED?
03700		GO	SWG1.2			;NOT EXPLODED
03800		TDZ	A,ALLBIT(SHIP)		;ZERO HIS BITS
03900		AOSE	RESTAR(SHIP)		;INCREMENT HIS RESTART DELAY
04000		GO	SWG1.2			;NOT READY TO RESTART
04100		SKIPL	QRSTRT			;SET TO RESTART GAME?
04200		PUSHJ	P,GAME2			;NO: RESTART THIS PLAYER
04300	SWG1.2:	SOJGE	SHIP,SWG1.1		;LOOP
04400		PUSHJ	P,JS			;GO DOWN AND INTERPRET THE BUTTONS
04500		MOVEI	BFP,BUF-1		;INITIALIZE BUFFER DEPOSIT POINTER
04600		PUSH	BFP,ZERO		;START THE BUFFER WITH A ZERO
04700		LAC	SHIP,NSHIPX		;FOR ALL SHIPS DO:
04800	SWG2:
04900	IFN	HYPERS,<			;IF HYPER SPACE IS AVAILABLE
05000		LAC	W,HYPEN			;RELOAD PENALTY FOR HYPERSPACE
05100		LAC	X,UTUBE(SHIP)		;GET HIS NEXT TUBE NUMBER
05200		SOSN	HYPER(SHIP)		;DECREASE HYPER COUNT
05300		DAC	W,@RDELAY(X)		;PENALIZE HIS RELOAD DELAY
05400	>
05500	IFN NHYP,<
05600		SOSLE	B,HYPER(SHIP)		;DECREMENT HYPERTIME
05700		GO	SWG2.1			;STILL IN HYPERSPACE
05800		JUMPL	B,SWG2.0		;NOT IN HYPERSPACE AT ALL
05900		MOVEI	B,4			;EXPLOSION CODE
06000		SKIPL	HYPCNT(SHIP)		;SKIP IF EXPLODE IN HYPER-SPACE
06100		GO	SWG2.0			;OK THIS GUY LIVES STILL
06200		DAC	B,ZOWSW(SHIP)		;POOF!
06300		PUSHJ	P,QRST0			;SET UP A RESTART
06400	>
06500	SWG2.0:	SOS	TCNT0(SHIP)		;DEC SHIP n TUBE 0 DELAY
06600		SOS	TCNT1(SHIP)		;DEC SHIP n TUBE 1 DELAY
06700		LAC	F,SRX(SHIP)		;GET ROTATIONAL INCREMENT
06800		FIX	F,211000		;FIX ON THE 10
06900		ADDB	F,SRA(SHIP)		;UPDATE SHIP ORIENTATION
07000		TLZ	F,777600		;ZERO ALL BUT INDEX BITS
07100		HLRZM	F,SR(SHIP)		;SAVE ORIENTATION INDEX
07200		PUSHJ	P,STCOL			;COMPUTE POSSIBLE COLLISIONS
07300		PUSHJ	P,GRAV			;COMPUTE GRAVITATIONAL INFLUENCE
07400	SWG2.1:	SOJGE	SHIP,SWG2		;FOR SHIP=1 AND SHIP=0
07500		PUSHJ	P,MINE			;DO ALL MINE CALCULATIONS
07600		LAC	SHIP,NSHIPX		;THE NEXT SECTION FOR SHIP = 1, 0
07700	SWG3:	LAC	R16,SP(SHIP)		;GET THE SHIP POSITION
07800		LAC	R15,SR(SHIP)		;GET THE SHIP ORIENTATION INDEX
07900		LAC	W,TAB(R15)		;GET THE CORRESPONDING COS-SIN
08000		IMUL	W,SPTAB(SHIP)		;MULTIPLY BY MAJIC NUMBER
08100		ADD	R16,W			;ADD IT IN
08200		DAC	R16,STEMP(SHIP)		;SAVE THE NOSE OF SHIP POSITION
08300		LAC	R14,SPICT(SHIP)		;GET ADDRESS OF PICTURE
08400		PUSHJ	P,XDRAW			;DRAW THE SHIP
08500		TDNE	A,TPBIT(SHIP)		;IS HE FIRING TORPEDOES?
08600		PUSHJ	P,CTORP			;TRY TO LAUNCH A TORPEDO
08700		SKIPG	HYPER(SHIP)		;NO FLAME FROM HYPER SPACE
08800		SKIPN	STX(SHIP)		;ANY THRUST
08900		GO	SWG4			;NO FLAME
09000		LAC	R15,SR(SHIP)		;GET THE SHIP ORIENTATION
09100		LAC	R15,TAB(R15)		;GET THE COS-SIN TABLE ENTRY
09200		LAC	R16,SP(SHIP)		;GET THE BASIC POSITION
09300		IMUL	R15,TFTAB(SHIP)		;MULTIPLY BY MAJIC NUMBER
09400		SUB	R16,R15			;SUBTRACT FROM THE BASIC POSITION
09500		LAC	R15,SR(SHIP)		;GET ORIENTATION
09600		LAC	W,RAND			;GET RANDOM NUMBER
09700		ROT	W,1			;ROTATE IT
09800		DAC	W,RAND			;REPLACE THIS IN CORE
09900		TLO	W,777760		;TURN ON BITS: MAKE A RANDOM LENGTH
10000		HRRI	W,100			;SET ORIENTATION=100, DOWN
10100		MOVEI	R14,W			;R14 POINTS TO W
10200		MOVEI	X,0			;W+1 IS ZERO TERMINATES LIST
10300		PUSHJ	P,DRAW			;DRAW THE FLAME
10400	SWG4:	SOJGE	SHIP,SWG3		;DO ALL THAT FOR SHIP=1 AND 0
10500		ZAC	W,			;UPDATE TORPEDOES.
10600	SWG5:	CAML	W,TPNT			;ARE WE STILL IN TABLE?
10700		GO	SWG6			;NOPE: ALL DONE
10800		SKIPG	TL(W)
10900		GO	Z6			;TORP EXPIRED
11000		SOS	Y,TL(W)			;DECREMENT TORP LIFE
11100		TRNN	Y,-1			;SKIP IF TIME >0
11200		GO	Z6			;THIS TORPEDO HAS EXPIRED
11300		LAC	X,TP(W)			;GET THE POSITION
11400		ADD	X,TV(W)			;ADD THE VELOCITY
11500		LAC	C,X			;SAVE NEW POSTION IN C
11600		PUSHJ	P,PLT1			;FOR CALL ON PLT1
11700		IORI	C,11126			;LVW WITH ENDPOINT,SIZ=BRT=2
11800		CAIGE	Y,10			;IS THIS ABOUT TO EXPIRE?
11900		IORI	C,37400			;YES: TURN ON BRIGHT AND BIG SIZE
12000		PUSH	BFP,C			;SAVE THIS IN THE DPY BUFFER
12100		EXCH	X,TP(W)			;SWAP NEW-OLD POSITION
12200		XOR	X,TP(W)			;XOR NEW AND OLD
12300		TDNN	X,[XWD	400000,400000]	;IF THESE BITS SET THEN SKIP
12400		AOJA	W,SWG5			;LOOK AT NEXT TORP
12500		LAC	F,TV(W)			;POSSIBLE WRAP OVER. GET VELOCITY
12600		XOR	F,TP(W)			;XOR WITH NEW POSITION
12700		AND	X,F			;AND WITH THE XOR OF OLD-NEW
12800		TDNE	X,[XWD	400000,400000]	;IF THESE ARE STILL SET
12900		PUSHJ	P,TCOL			;THEN WE HAVE WRAPPED. CHECK TCOL
13000		AOJA	W,SWG5			;LOOK FOR MORE
13100	Z6:	SOS	X,TPNT			;TORP HAS EXPIRED
13200		CAML	W,X			;THIS THE LAST IN TABLE?
13300		GO	SWG6			;YES: OUT OF THE LOOP
13400		LAC	Y,TP(X)			;GET LAST FROM TABLE
13500		DAC	Y,TP(W)			;USE IT TO WIPE THIS ONE
13600		LAC	Y,TV(X)			;...
13700		DAC	Y,TV(W)			;...
13800		LAC	Y,TL(X)			;...
13900		DAC	Y,TL(W)			;...
14000		LAC	Y,TVX(X)		;...
14100		DAC	Y,TVX(W)		;...
14200		LAC	Y,TVY(X)		;...
14300		DAC	Y,TVY(W)		;...
14400		GO	SWG5			;LOOK FOR MORE. DONT CHANGE W.
14500	SWG6:	HLRZM	BFP,BPTRX+1		;STORE NUMBER OF WORDS TO DISPLAY
14600		SETOM	SHIPFG			;TELL PDP-10 WE HAVE A DISPLAY READY
14700		SETOM	SIXDON
14800		SKIPN	DEBUG			;ARE WE USING DDT?
14900		DISMIS				;NOPE: DISMISS THIS SW MODULE
15000		ZAC	B,			;GO TO SLEEP FOR A WHILE
15100		SLEEP	B,			;SLEEP 1 TICK
15200		GO	SW6GO			;A GO TO WORK AGAIN
     

00100		SUBTTL	THE MINE CALCULATIONS
00200	IFE NMINE,<
00300	MINE:	POPJ	P,			;NO MINES
00400	>
00500	IFG NMINE,<
00600	MINE:	LAC	SHIP,NMINEX		;ALL THE CALCULATIONS FOR THE MINES
00700		ADDI	SHIP,NSHIP-1		;ADD TO INDEX THE MINE TABLES
00800		LAC	R15,BFP			;SAVE BFP TO LEARN IF ANY ARE ALIVE
00900	MINE1:	CAIG	SHIP,NSHIP-1		;ARE WE DONE YET?
01000		GO	MINE6			;YES. TO EXIT STUFF
01100		SKIPN	C,SP(SHIP)		;GET MINE POSITION
01200		SOJA	SHIP,MINE1		;MINE IS DEAD
01300		HLRE	B,C			;GET MINE -2Y
01400		HRRE	C,C			;GET MINE  2X
01500		MOVEI	R12,1			;1 = TORPS, 0 = MINES
01600		LAC	R11,TPNT		;GET TORPEDO COUNT
01700		GO	MINE3			;CHECK MINE-TORPEDO COLISION
01800	MINE2:	MOVEI	R11,-1(SHIP)		;GET INDEX OF THIS MINE
01900		SUBI	R11,NSHIP-1		;LOOK AT MINE- LOWER MINES
02000	MINE3:	SOJL	R11,MINE4		;ALL DONE WITH THESE OBJECTS
02100		HLRE	W,@STTB2(R12)		;GET OBJECT POSITION -2Y
02200		HRRE	X,@STTB2(R12)		;GET OBJECT POSITION +2X
02300		SUB	W,B			;GET DY
02400		SUB	X,C			;GET DX
02500		FSC	W,223			;FLOAT DIFFERENCE
02600		FSC	X,223			;FLOAT
02700		FMP	W,W			;SQUARE
02800		FMP	X,X			;SQUARE
02900		FAD	W,X			;GET R↑2
03000		CAMLE	W,MTCOLR		;COMPARE TO COLISION RADIUS
03100		GO	MINE3			;OK. LOOK FOR MORE
03200		DZM	@STTB3(R12)		;ZERO A MINE OR TORP LIFE
03300		LAC	C,SP(SHIP)		;GET MINE POSITION
03400		DZM	SP(SHIP)		;MINE IS NOW GONE AWAY
03500		GO	MINE5			;MAKE IT FLASH
03600	MINE4:	SOJE	R12,MINE2		;LOOK FOR MINE-MINE COLISIONS
03700		PUSHJ	P,GRAV			;COMPUTE GRAVITY FOR MINE
03800		SKIPN	C,SP(SHIP)		;GET POSITION
03900		GO	MINE5			;THIS IS A LOSER
04000		PUSHJ	P,PLT1			;MAKE IT A VECTOR
04100		SUB	C,[BYTE(11)20,14]	;CENTER IT
04200		IORI	C,6+VINVIS+VABS+VSIZ+4*VBRT	;INVIS, ABS, SIZE 1, BRT 4
04300		PUSH	BFP,C			;SEND OUT VECTOR
04400		PUSH	BFP,[<ASCII/*/>+1]	;SEND TEXT
04500		SOJA	SHIP,MINE1		;NEXT MINE
04600	MINE5:	PUSHJ	P,FLASH0		;MAKE A FLASH
04700		SOJA	SHIP,MINE1		;LOOP
04800	MINE6:	CAME	R15,BFP			;ANY TEXT DONE THIS TIME?
04900		POPJ	P,			;YES. RETURN
05000		SKIPGE	MINSTR			;MINE RESTART SET?
05100		GO	MINE7			;YES: COUNT IT DOWN
05200		LAC	R11,RSTARD		;GET RESTART DELAY
05300		MOVNM	R11,MINSTR		;SET IT
05400		POPJ	P,			;RETURN
05500	MINE7:	AOSE	MINSTR			;INCREMENT AND TEST IT
05600		POPJ	P,			;RETURN
05700						;FALL INTO MINE LAYING
05800	
05900	
06000	
06100	LAYMIN:	LAC	R12,RANDX		;LAY THE MINES
06200		LAC	W,NMINEX		;GET THE NUMBER OF MINES TO MAKE
06300	LAY1:	SOJL	W,CPOPJ			;DECREMENT COUNT. RETURN WHEN DONE
06400		ADD	R12,RCONST		;LOAD THE RANDOM BASE
06500		DAC	R12,RANDX		;GET A RANDOM NUMBER
06600		DAC	R12,MINEP(W)		;SAVE AS THE MINE POSITION
06700		HRRE	X,R12			;GET 2X
06800		HLRE	Y,R12			;GET -2Y
06900		FSC	X,223			;FLOAT X
07000		FSC	Y,223			;FLOAT Y
07100		DAC	X,MINEX(W)		;SAVE X POSITION
07200		MOVNM	Y,MINEY(W)		;SAVE Y POSITION
07300		MOVN	Y,Y			;GET +Y POSITION
07400		LAC	D,X			;GET X
07500		FMP	D,D			;X↑2
07600		LAC	B,Y			;GET Y
07700		FMP	B,B			;Y↑2
07800		FADB	B,D			;R↑2
07900		PUSHJ	P,SQRT			;GET R
08000		FMP	B,D			;B ← R↑3
08100		LAC	C,GG			;GRAV CONSTANT
08200		FDVM	C,B			;B ← GG/R↑3
08300		PUSHJ	P,SQRT			;GET SQRT(GG/R↑3)
08400		LAC	C,B			;SQRT(GG/R) IN C AND B
08500		FMP	C,X			;Y VELOCITY
08600		FMP	B,Y			;X VELOCITY
08700		MOVNM	C,MINEVY(W)		;SAVE -Y VELOCITY
08800		DAC	B,MINEVX(W)		;SAVE +X VELOCITY
08900		FIX	B,223000
09000		FIX	C,223000
09100		HRL	B,C			;GET Y VELOCITY INTO B
09200		DAC	B,MINEV(W)		;SAVE THE MINE VELOCITY (FIXED POINT)
09300		TRNE	R12,1000		;TEST A RANDOM BIT
09400		GO	LAY1			;KEEP THIS VELOCITY SENSE
09500		MOVNS	MINEV(W)		;NEGATE SENSE OF VELOCITIES
09600		MOVNS	MINEVX(W)		;NEGATE SENSE OF VELOCITIES
09700		MOVNS	MINEVY(W)		;NEGATE SENSE OF VELOCITIES
09800		GO	LAY1			;LOOP
09900	>
     

00100		SUBTTL	LAUNCH A TORPEDO
00200		
00300	CTORP:	LAC	W,TPNT			;GET COUNT OF ACTIVE TORPS
00400		LAC	X,UTUBE(SHIP)		;GET THE TUBE NUMBER FOR THIS
00500		CAMGE	W,TTBMAX		;IS THERE ROOM IN THE TABLE?
00600		SKIPL	@RDELAY(X)		;YES: CHECK RELOAD DELAY
00700		POPJ	P,			;TABLE FULL OR NOT RELOADED
00800		SOSLE	W,TPCN(SHIP)		;DECREMENT TORPEDO COUNT
00900		GO	TRLD			;LAUNCH IT
01000		LAC	W,NSHIPX		;CHECK ALL OTHER SHIPS
01100		SKIPLE	TPCN(W)			;ANY TORPS LEFT FOR THIS?
01200		POPJ	P,			;SOMEBODY HAS TORPEDOES
01300		SOJGE	W,.-2			;LOOK FOR SOMEONE WITH TORPS
01400		LAC	X,RSTARD		;USE RSTARD AS GAME RESET DELAY
01500		MOVNM	X,QRSTRT		;ALL EMPTY: SET TO RESTART
01600		POPJ P,				;RETURN
01700		
01800	TRLD:	LAC	W,TRELOD		;GET THE RELOAD TIME
01900		DAC	W,@RDELAY(X)		;RESET DELAY ON THIS TUBE
02000		TRC	X,1			;SET UP THE OTHER TUBE NUMBER
02100		DAC	X,UTUBE(SHIP)		;USE OTHER TUBE NEXT TIME
02200		LAC	W,LATNCY		;LOAD THE LATENCY PERIOD
02300		CAML	W,@RDELAY(X)		;SKIP IF EXISTING DELAY > LATENCY
02400		DAC	W,@RDELAY(X)		;USE LATENCY AS MINIMUM
02500		LAC	W,SR(SHIP)		;GET THE SHIP ORIENTATION
02600		HLRE	X,TAB(W)		;GET THE COSINE
02700		MUL	X,ITV			;MULTIPLY BY TORP VELOCITY
02800		HRRE	W,TAB(W)		;GET THE SINE
02900		MUL	W,ITV			;Y COMPONENT OF VELOCITY
03000		HLR	Y,X			;RELATIVE VELOCITY OF TORP
03100		ADD	Y,SV(SHIP)		;PLUS SHIP VELOCITY
03200		LAC	W,TPNT			;GET NUMBER OF TORPS
03300		DAC	Y,TV(W)			;SAVE THE ABSOLUTE TORP VELOCITY
03400		LAC	X,STEMP(SHIP)		;GET THE SHIP NOSE POINT
03500		DAC	X,TP(W)			;SAVE AS THE INITIAL TORP POSIT.
03600		LAC	X,TLIFE			;GET THE LIFE
03700		HRL	X,SHIP
03800		DAC	X,TL(W)			;SHIP NUMBER,,LIFE TIME
03900		AOS	TPNT			;COUNT A NEW TORPEDO
04000	TCOL:	LAC	X,TPNT			;DOES TORP EVER COLLIDE WITH ANOTHER?
04100		HRRE	B,TV(W)			;ACTIVE TORPS IN X. GET THIS VELOCITY
04200		FSC	B,223			;FLOAT THIS NUMBER
04300		DAC	B,TVX(W)		;SAVE X COMPONENT OF T. VELOCITY
04400		HLRE	C,TV(W)			;GET -2Y VELOCITY
04500		FSC	C,223			;MAKE IT FLOAT
04600		DAC	C,TVY(W)		;SAVE Y COMPONENT OF VELOCITY
04700		HRRE	R11,TP(W)		;GET 2X POSITION
04800		FSC	R11,223			;FLOAT IT 
04900		HLRE	R12,TP(W)		;GET -2Y POSITION
05000		FSC	R12,223			;FLOAT IT
05100		HRLO	R16,TL(W)		; TL,,-1 IN R16
05200	TCL1:	SOJL	X,TCBASH		;LOOK AT NEXT TORPEDO IN TABLE
05300		CAMN	W,X			;IS THIS US?
05400		GO	TCL1			;YES: SKIP THE CALCULATION
05500		HRRE	B,TP(X)			;GET THE 2X POSITION
05600		FSC	B,223			;FLOAT IT 
05700		FSBM	R11,B			;GET DELTA X IN B
05800		HLRE	C,TP(X)			;GET -2Y POSITION
05900		FSC	C,223			;FLOAT IT
06000		FSB	C,R12			;FORM DELTA Y IN C
06100		LAC	Y,TVX(W)		;Y ← VX1-VX2
06200		FSB	Y,TVX(X)		;...
06300		MOVN	R15,TVY(W)		;R15  ← VY1-VY2
06400		FAD	R15,TVY(X)		;...
06500		LAC	D,B		;D ←"B" =2((X1-X2)(VX1-VX2)+(Y1-Y2)(VY1-VY2))
06600		FMP	D,Y
06700		LAC	F,C
06800		FMP	F,R15
06900		FAD	D,F
07000	
07100		FMP	B,B		;B ← "C" = (X1-X2)↑2 + (Y1-Y2)↑2 - R↑2
07200		FMP	C,C
07300		FAD	B,C
07400		FSB	B,TR2
07500		JUMPLE	B,TBAM			;IMMEDIATE DISINTEGRATION OF TORPS
07600	
07700		FMP	Y,Y		;Y ← "A" = (VX1-VX2)↑2 + (VY1-VY2)↑2
07800		FMP	R15,R15
07900		FAD	Y,R15
08000		JUMPE	Y,TCL1
08100		FMP	B,Y		;B = "B"↑2 - 4*"A"*"C"
08200		LAC	C,D
08300		FMP	C,C
08400		FSBM	C,B
08500		JUMPLE	B,TCL1		;DISCRIMINANANT IS < 0, SO NO COLLISION.
08600	
08700		PUSHJ	P,SQRT		;FINISH QUADRATIC FORMULA.
08800		MOVN	D,D		;B ← -"B"-SQRT(DISC.)
08900		FSBM	D,B
09000		FDV	B,Y
09100		MULI	B,400		;FIX RELATIVE TIME OF COLLISION.
09200		ASH	C,-243(B)
09300		JUMPL	C,TCL1		;IF NEG TIME
09400		JUMPE	C,TBAM		;INSTANT EXPLOSION
09500		CAR	B,TL(W)		;GET LIFTIME
09600		CAR	D,TL(X)		;GET LIFTIME
09700		CAMG	C,D		;WILL BOTH TORPS BE ALIVE THEN?
09800		CAMLE	C,B		;NOPE: FORGET IT
09900		GO	TCL1		;NO COLISION
10000		HRL	C,C
10100		HRR	C,X
10200		CAMG	C,R16		;IS THIS COLLISION SOONER THAN OUR SOONEST?
10300		LAC	R16,C		;YES
10400		GO	TCL1		;LOOP
10500	TCBASH:	HLRM	R16,TL(W)	;SAVE THE EXPECTED LIFE
10600		TRNN	R16,700000	;R16 CONTAINS THE GUY WE COLIDE WITH
10700		HLRM	R16,TL(R16)	;SO SAVE THIS AS HIS TL
10800		POPJ	P,
10900	
11000	TBAM:	DZM	TL(W)		;MAKE BOTH TORPS. GO AWAY.
11100		DZM	TL(X)
11200		POPJ	P,
     

00100		SUBTTL	XDRAW AND DRAW
00200		
00300	XDRAW:	SKIPE	R12,ZOWSW(SHIP)		;IS THIS GUY GONE?
00400		GO	ZORCH			;YES.
00500		SKIPG	R12,HYPER(SHIP)		;IS THIS SHIP IN HYPERSPACE?
00600		GO	XDRAW2			;NO. DRAW IT
00700	IFN NHYP,<
00800		CAILE	R12,60			;TIME FOR THE STAR OF THE EAST?
00900		POPJ	P,			;NOPE
01000		LAC	C,SP(SHIP)		;GET CENTER OF SHIP
01100		PUSHJ	P,PLT1			;MAKE LVW
01200		IORI	C,6+7*VBRT+VENDP+VABS	;BRIGHT ENDPOINT ABSOLUTE
01300		PUSH	BFP,C			;STUFF IN BUFFER
01400		PUSH	BFP,C			;SECOND TIME FOR A VERY BRIGHT STAR
01500	>
01600		POPJ	P,			;RETURN
01700	XDRAW2:	LAC	R12,UTUBE(SHIP)		;GET THE NEXT TUBE TO USE
01800		SKIPGE	@RDELAY(R12)		;SKIP IF TUBE IS UNREADY
01900		SKIPGE	TPCN(SHIP)		;TUBE READY. ANY TORPS LEFT?
02000		GO	DRAW			;NOT READY OR EMPTY
02100		LAC	R12,TPNT		;GET ACTIVE COUNT
02200		CAML	R12,TTBMAX		;LESS THAN MAX
02300		GO	DRAW			;NO: GUN IS JAMMED
02400		LAC	C,SP(SHIP)		;GET SHIP CENTER
02500		PUSHJ	P,PLT1			;MAKE LVW
02600		IORI	C,6+7*VBRT+VABS+VENDP	;DISPLAY RELOAD LITE
02700		PUSH	BFP,C			;STUFF IN THE BUFFER
02800		PUSH	BFP,C			;SECOND TIME FOR VERY BRIGHT
02900	DRAW:	LAC	C,R16			;GET SHIP NOSE POSITION
03000		PUSHJ	P,PLT1			;MAKE LVW
03100		IORI	C,34146			;INVISIBLE, ABSOLUTE, BRITE
03200		PUSH	BFP,C			;STUFF THE LVW
03300	L2:	SKIPN	R12,(R14)		;R14 POINTS TO SHIP TABLE
03400		POPJ	P,			;NO MORE SHIP TABLE
03500		HLRE	F,R12			;GET THE STEP COUNT
03600		ADD	R12,R15			;ADD THE ORIENTATION
03700		ANDI	R12,177			;MAKE IT AN INDEX
03800	LLL:	ADD	R16,TAB(R12)		;ADD ORIENTATION TO POSITION
03900		LAC	C,R16			;LOAD NEW POINT
04000		PUSHJ	P,PLT1			;MAKE LVW
04100		IORI	C,14126			;TURN ON ENDPOINT, BRITE
04200		PUSH	BFP,C			;STUFF IT
04300		AOJL	F,LLL			;LOOP UNTIL NO MORE STEPS
04400		AOJA	R14,L2			;GET NEXT PART OF SHIP TABLE
04500	PLT1:	LDB	B,[POINT 10,C,27]	;GET BITS 18-27: X POSITION
04600		ASH	C,-1			;SHIFT -2Y TO -Y
04700		SETCM	C,C			;ONES COMPLEMENT: MAKE +Y
04800		LSHC	B,-12			;SHIFT X INTO C
04900		ASH	C,-1			;ONE MORE PLACE FOR 11 BIT FIELD
05000		TRZ	C,37777			;SHUT OF ALL BUT X,Y BITS
05100		POPJ	P,			;AND RETURN
05200	ZORCH:	SKIPLE	ZORCHP(SHIP)		;IS THIS FIRST TIME THRU?
05300		GO	ZORCH1			;NOPE,
05400		PUSHJ	P,FLASH			;FIRST TIME: MAKE A FLASH
05500		LAC	R14,RCONST
05600		ADDB	R14,RANDX		;MAKE A NEW RANDOM NUMBER
05700		DAC	R14,HYPCNT(SHIP)	;HYPCNT ISN'T NEEDED ANYMORE.
05800	ZORCH1:	AOS	R14,ZORCHP(SHIP)	;COUNT TIMES THRU
05900		SKIPL	ZOWSW(SHIP)		;QUICK RETURN FOR FALL IN THE SUN
06000		CAIL	R14,60			;IS THIS ENOUGH?
06100		POPJ	P,			;RETURN
06200		LSH	R14,-3			;DIVIDE BY 32
06300		SUBI	R14,13			;14 IS MAX NUMBER OF FRAGS
06400		LAC	R12,[POINT 3,HYPCNT(SHIP)]	;POINTER TO A DOZEN VELOCITIES
06500		LAC	R11,[POINT 7,HYPCNT(SHIP),6]	;POINTER THAT SLIDES
06600	ZORCH2:	ILDB	B,R12			;GET A VELOCITY
06700		IMUL	B,ZORCHP(SHIP)		;TIMES THE TIME
06800		ASH	B,-2			;SCALE IT DOWN
06900		LDB	C,R11			;GET A DIRECTION
07000		ADD	C,R15			;ADD IN BASE DIRECTION
07100		ANDI	C,177			;MAKE INDEX TO TAB
07200		MUL	B,TAB(C)		;MULTIPLY BY FRAGMENT DIRECTION
07300		SUB	R11,[XWD 20000,0]	;SLIDE THE DIRECTION OVER TWO BITS
07400		ADD	C,R16			;ADD IN THE BASIC POSITION
07500		PUSHJ	P,PLT1			;MAKE LVW
07600		LAC	B,RCONST		;GET A RANDOM NUMBER
07700		ADDB	B,RANDX			;FOR THE BRIGHTNESS
07800		ANDI	B,7*VBRT		;AND OUT ALL BUT BRT
07900		IORI	C,6+VABS+VENDP(B)	;OR THE MAJIC BITS
08000		PUSH	BFP,C			;STUFF IT
08100		TRNE	B,VBRT
08200		PUSH	BFP,C
08300		AOJLE	R14,ZORCH2		;LOOP FOR EACH PARTICLE
08400		POPJ	P,			;RETURN
08500	FLASH:	LAC	C,R16			;MAKE A FLASH. GET OBJECT POSITION
08600	FLASH0:	PUSHJ	P,PLT1			;MAKE LVW
08700		IORI	C,6+7*VBRT+VABS+VINVIS+2*VSIZ	
08800	FLASHX:	MOVEI	B,FLASHL-1		;GET TABLE SIZE
08900	FLASH1:	PUSH	BFP,C			;STUFF VECTOR
09000		PUSH	BFP,FLASHT(B)		;STUFF CHARACTER
09100		SOJGE	B,FLASH1		;LOOP
09200		POPJ	P,			;RETURN
09300	FLASHT:	<ASCII	/*/>+1			;TABLE OF CHARACTERS
09400		<ASCII	/W/>+1
09500		<ASCII	/#/>+1
09600		<ASCII	/@/>+1
09700		<ASCII	/*/>+1
09800		SDEF(FLASHL,.-FLASHT)		;FLASH TABLE LENGTH
     

00100		SUBTTL	SIN, COS AND SQRT
00200	COS:	FSB	A,[4.712389]
00300	SIN:	MOVNI	F,10
00400		LAC	Y,[1.0]
00500		LAC	C,[1.0]
00600		JFCL	10,.+1
00700		LAC	W,A
00800		MOVN	D,A
00900		FMP	D,A
01000	L1:	FAD	Y,[1.0]
01100		FMP	C,Y
01200		FAD	Y,[1.0]
01300		FMP	C,Y
01400		FMP	W,D
01500		LAC	X,W
01600		FDV	X,C
01700		JFCL	10,CPOPJ
01800		FAD	A,X
01900		AOJL	F,L1
02000		POPJ	P,
02100	
02200	SQRT:	ASHC	B,-33
02300		SUBI	B,201
02400		ROT	B,-1
02500		PUSH	P,B
02600		LSH	B,-43
02700		ASH	C,-10
02800		FSC	C,177(B)
02900		DAC	C,1(P)			;WATCH OUT FOR THE BUM WHO WROTE THIS
03000		FMP	C,SQ1(B)
03100		FAD	C,SQ2(B)
03200		LAC	B,1(P)
03300		FDV	B,C
03400		FAD	C,B
03500		FSC	C,-1
03600		LAC	B,1(P)
03700		FDV	B,C
03800		FADR	B,C
03900		POP	P,C
04000		FSC	B,(C)
04100		POPJ	P,
04200	SQ1:	0.8125				;CONSTANTS FOR SQRT ROUTINE
04300		0.578125
04400	SQ2:	0.302734
04500		0.421875
     

00100		SUBTTL	GRAV:	CALCULATE SHIP POSITION
00200	GRAV:	CAILE	SHIP,NSHIP-1		;SKIP IF A SHIP
00300		GO	GRAV1			;IS A MINE
00400		SKIPGE	ZOWSW(SHIP)		;LOOK AT SHIP'S ZOWSW
00500		POPJ	P,			;DID COLLIDE WITH THE SUN
00600	GRAV1:	LAC	B,SX(SHIP)		;GET X POSITION
00700		LAC	C,SY(SHIP)		;GET Y POSITION
00800		FMP	B,B			;X↑2
00900		FMP	C,C			;Y↑2
01000		FAD	B,C			;R↑2
01100		MOVN	X,B			;X ← -R↑2
01200		PUSHJ	P,SQRT			;GET R
01300		CAMG	B,SCR			;ARE WE TOO CLOSE TO THE SUN?
01400		GO	ZOWIE1			;YES: MAKE OBJECT DISAPPEAR
01500		FMP	B,X			;B ← -R↑3
01600		LAC	C,GG			;GET GRAVITY CONSTANT IN C
01700		FDVB	C,B			;-GG/R↑3 IN C AND B
01800		FMP	B,SX(SHIP)		;-GG*X/R↑3 IN B = X ACCELERATION
01900		FMP	C,SY(SHIP)		;-GG*Y/R↑3 IN C = Y ACCELERATION
02000		CAIG	SHIP,NSHIP-1		;IS THIS A MINE?
02100		SKIPN	STX(SHIP)		;IS HE THRUSTING?
02200		GO	GINT			;NO THRUST FROM A SHIP, OR A MINE
02300		LAC	D,SR(SHIP)		;GET THE SHIP ORIENTATION
02400		HRRE	W,TAB(D)		;GET THE -COS
02500		FSC	W,206			;FLOAT IT
02600		FMP	W,STX(SHIP)		;MULTIPLY WITH THE THRUST
02700		FAD	B,W			;ADD THIS TO THE X ACCELERATION
02800		HLRE	W,TAB(D)		;GET THE SIN
02900		FSC	W,206			;FLOAT IT
03000	
03100		FMP	W,STX(SHIP)		;MULTIPLY BY THE THRUST
03200		FSB	C,W			;SUBTRACT FROM THE Y ACCELERATION
03300		
03400	GINT:	FMP	B,GDT			;MULTIPLY ACCELERATION BY DELTA T
03500		FMP	C,GDT			;THE PRODUCT IS DELTA VELOCITY
03600		FADB	B,SVX(SHIP)		;ADD DELTA TO EXISTING VELOCITY
03700		FADB	C,SVY(SHIP)		;...
03800		FMP	B,GDT			;TAKE VELOCITY*DELTA T
03900		FMP	C,GDT			;FORMS A DELTA X AND Y
04000		LAC	W,C			;DELTA Y IN W
04100		MULI	W,400
04200		TSC	W,W
04300		ASH	X,-211(W)
04400		MOVNM	X,SV(SHIP)		;SAVE -2Y IN SHIP VELOCITY
04500		LAC	W,B			;GET DELTA X INTO W
04600		MULI	W,400			;FIX IT
04700		TSC	W,W
04800		ASH	X,-211(W)
04900		HLRM	X,SV(SHIP)		;-2*DELTA Y,,2*DELTA X IN SV
05000		FAD	B,SX(SHIP)		;ADD THE POSITION
05100		FAD	C,SY(SHIP)		;...
05200		CAML	B,[511.0]		;CHECK THE POSITION ON THE SCREEN
05300		FSB	B,[1024.0]
05400		CAMG	B,[-512.0]
05500		FAD	B,[1024.0]
05600		CAML	C,[511.0]
05700		FSB	C,[1024.0]
05800		CAMG	C,[-512.0]
05900		FAD	C,[1024.0]
06000		DAC	B,SX(SHIP)
06100		DAC	C,SY(SHIP)		;SAVE (REVISED) POSITIONS
06200		
06300		MULI	C,400			;FIX THE POSITIONS
06400		TSC	C,C
06500		ASH	D,-211(C)
06600		MOVNM	D,SP(SHIP)
06700		MULI	B,400
06800		TSC	B,B
06900		ASH	C,-211(B)
07000		HLRM	C,SP(SHIP)		;SAVE FIXED POSITIONS IN SP
07100		POPJ	P,
     

00100		SUBTTL	SHIP - TORPEDO AND SHIP - MINE COLISION
00200	STCOL:	SKIPE	ZOWSW(SHIP)		;THIS SHIP DEAD?
00300		POPJ	P,			;YES, CAN'T COLLIDE WITH ANYTHING
00400		LAC	W,SR(SHIP)		;GET SHIP ORIENTATION
00500		MOVN	X,TAB(W)		;GET --COS
00600		HRLZ	Y,TAB(W)		;AND +SIN
00700		MOVN	W,SP(SHIP)		;GET --Y POS.
00800		HRLZ	D,SP(SHIP)		;AND X POS.
00900		MOVEI	R12,1			;1 FOR TORPS, 0 FOR MINES
01000	STL0:	LAC	R11,@STTB1(R12)		;GET TPNT OR NMINEX
01100	STL1:	SOJL	R11,STL2		;ALL DONE WITH TORPS-DO MINES
01200		LAC	B,@STTB2(R12)		;GET POS. OF TORP (OR MINE)
01300		JUMPE	B,STL1			;EXPIRED MINE
01400		LAC	F,R12			;WE MAY INTERPOLATE IF F > 0
01500	STL1.1:	MOVN	C,B			;LOAD C WITH 2Y POSITION OF TORP
01600		MOVS	B,B			;SWAP B. X POSITION OF OBJECT
01700		SUB	B,D			;GET DELTA X FROM TORP TO SHIP
01800		CAMG	B,[25B9]		;IS IT EVEN CLOSE?
01900		CAMGE	B,[-25B9]		;....
02000		GO	STL1			;NO
02100		SUB	C,W			;GET DELTA Y
02200		CAMG	C,[25B9]		;IS IT CLOSE?
02300		CAMGE	C,[-25B9]		;.....
02400		GO	STL1			;NO
02500		LAC	R14,B			;R14 ← DELTA X
02600		MUL	R14,X			;GET dx cos (phi)
02700		LAC	R15,C			;R15 ← DELTA Y
02800		MUL	R15,Y			;GET dY sin(phi)
02900		SUB	R14,R15			;x' = dx cos(phi)-dy sin(phi)
03000		DAC	R14,SAVSID		;REMEMBER SIDE WERE ON
03100		MOVM	R14,R14			;GET ABS(X'). (SHIP IS SYMMETRIC)
03200		CAML	R14,[13B17]		;IN BOUNDS?
03300		GO	STINTR			;NOPE: SEE ABOUT INTERPOLATING
03400		LAC	R15,C			;NOW ROTATE DY INTO SHIP COORDINATES
03500		MUL	R15,X			;DY COS(PHI)
03600		MUL	B,Y			;DX SIN(PHI)
03700		ADD	R15,B			;Y' = DXSIN(PHI)+DY COS(PHI)
03800		CAMG	R15,[25B17]		;Y VALUE IN BOUNDS?
03900		CAMGE	R15,[-27B17]		;...
04000		GO	STINTR			;NOPE: SEE ABOUT INTERPOLATION
04100		CAML	R15,[-12B17]		;SKIP IF TORP IN WIDE TAIL
04200		CAMG	R14,[4B17]		;SKIP UNLESS TORP IN NARROW BODY
04300		GO	STX2			;WE HAVE A COLISION
04400	STINTR:	SOJL	F,STL1			;NO INTERPOLATION: SECOND TRY OR MINES
04500		MOVN	B,TV(R11)		;GET -(THE TORPEDO VELOCITY)
04600		HRRE	C,B			;GET RIGHT SIDE
04700		ASH	B,-1			;HALVE LEFT OF B
04800		ASH	C,-1			;HALVE RIGHT OF C
04900		HRR	B,C			;RELOAD B WITH HALF OF RIGHT SIDE
05000		ADD	B,TP(R11)		;ADD TO TORPEDO POSITION
05100		GO	STL1.1			;B CONTAINS INTERPOLATED POSITION
05200	STL2:	SOJGE	R12,STL0		;AFTER TORPS, DO MINES, THEN
05300		POPJ	P,			;RETURN
05400	STX2:	SKIPE	DAMHIT			;PARTIAL DAMAGE ALLOWED?
05500		CAMG	R14,[4B17]		;DIRECT HIT?
05600		GO	STX3			;NO PARTIAL DAMAGE OR KILLED DEAD
05700		DZM	@STTB3(R12)		;KILL OBJECT
05800		SKIPL	SAVSID			;CHECK SIDE
05900		SKIPA	R14,ROTLBT(SHIP)	;HIT RIGHT
06000		LAC	R14,ROTRBT(SHIP)	;HIT LEFT
06100		TDOE	R14,DMASK		;SET BIT IN THE DAMAGE LIST
06200		GO	STX3			;KILL GUY
06300		IORM	R14,DMASK		;SET BIT IN DAMAGE LIST
06400		LAC	C,@STTB2(R12)		;GET WHERE
06500		PUSHJ	P,PLT1			;LVW
06600		IORI	C,7*VBRT+VSIZ+VINVIS+VABS+6;
06700		GO	FLASHX			;FLASH & RETURN
06800	
06900	STX3:	ZAC	R14,
07000		EXCH	R14,@STTB3(R12)
07100		MOVEI	F,2(R12)		;ZERO OBJECT. SET XPLOSION TYPE
07200		DAC	F,ZOWSW(SHIP)		;SAVE EXPLOSION TYPE
07300		JUMPE	R12,QRST0		;JUMP IF SHIP-MINE
07400		LAC	R11,KILLBN		;KILLER'S REWARD
07500		CDR	R14,R14			;GET THE NAME OF THE KILLER IN R14
07600		SKIPE	KILLER
07700		ADDM	R11,NUMWN(R14)		;INCREASE HIS SCORE
07800		GO	QRST1			;GO THINK ABOUT RESTARTING
07900	ZOWIE1:	DZM	SP(SHIP)		;ZERO POSITION MEANS DIED IN SUN
08000		CAIG	SHIP,NSHIP-1		;SKIP IF A MINE
08100		SKIPE	ZOWSW(SHIP)		;SKIP IF SHIP WAS ALIVE
08200		POPJ	P,			;MINE- SUN COLISION
08300		SKIPN	KILSUN			;DO WE HAVE KILLER SUN?
08400		GO	ZOWMAP			;AND, IT'S ONLY OUR PAPER SUN
08500		SETOM	ZOWSW(SHIP)		;SIGNIFIES DEATH BY THE SUN
08600	QRST0:	AOS	GALAXY			;COUNT ONE FOR GALACTIC OVERHEAD
08700	QRST1:	LAC	R14,RSTARD		;LOAD RESTART DELAY
08800		MOVNM	R14,RESTAR(SHIP)	;SAVE IT
08900		MOVN	R14,DIEPEN		;PENALTY FOR DYING
09000		ADDM	R14,NUMWN(SHIP)		;UPDATE SCORE
09100		PUSHJ	P,CNT4			;DISPLAY SCORE
09200		SKIPE	DOTEAM			;ARE WE DOING TEAM SCORES?
09300		GO	QRST2			;YES COMPUTE IF ONE TEAM WIPED OUT
09400		LAC	R14,NSHIPX		;ARE THERE ANY LEFT?
09500		SETO	F,			;COUNT NUMBER LEFT
09600		SKIPN	ZOWSW(R14)		;IS THIS STILL HERE
09700		ADDI	F,1			;YES: COUNT IT
09800		SOJGE	R14,.-2			;LOOP
09900		JUMPG	F,CPOPJ			;JUMP IF >1 LEFT
10000		GO	QRST3			;OK. SET THE RESTART TIME
10100	QRST2:	LAC	R14,NSHIPX		;LOOK AT ALL SHIPS
10200	QRST2A:	SUBI	R14,1			;DECREMENT
10300		SKIPE	ZOWSW(R14)		;SKIP IF STILL ALIVE
10400		SKIPN	ZOWSW+1(R14)		;DEAD. SKIP IF TEAMMATE LIVES
10500		SOJGE	R14,QRST2A		;ONE TEAM IS PARTIALLY LIVE
10600		JUMPL	R14,CPOPJ		;RETURN IF BOTH TEAMS THERE
10700	QRST3:	LAC	F,TLIFE			;TIME TO RESTART
10800		MOVNM	F,QRSTRT		;SET RESTART TIME
10900		POPJ	P,			;RETURN
11000	
11100	ZOWMAP:	LAC	F,[XWD 377777,377777]
11200		DAC	F,SP(SHIP)
11300		MOVEI	F,377777
11400		FSC	F,223
11500		DAC	F,SX(SHIP)
11600		DAC	F,SY(SHIP)
11700		POPJ	P,
     

00100	JS:	DZM	JSTB				;ZERO TABLE BEGINNING
00200		LAC	B,[XWD JSTB,JSTB+1]		;LOAD BLT POINTER
00300		BLT	B,JSTBX				;RUN THRU TABLE WITH ZEROES
00400		TDZ	A,DMASK				;ASSESS DAMAGES
00500		LAC	F,BTX				;GET STANDARD THRUST
00600		LAC	B,BRX				;GET STANDARD ROTATION
00700		LAC	C,HYTIME			;STANDARD HYPERSPACE DURATION
00800		LAC	SHIP,NSHIPX			;FOR THIS MANY SHIPS
00900	BITLOP:	TDNE	A,THRUBT(SHIP)			;IS HE THRUSTING?
01000		DAC	F,STX(SHIP)			;YES. GIVE HIM SOME
01100		TDNE	A,ROTRBT(SHIP)			;ROTATING RIGHT?
01200		DAC	B,SRX(SHIP)			;YES
01300		TDNE	A,ROTLBT(SHIP)			;ROTATING LEFT?
01400		MOVNM	B,SRX(SHIP)			;YES GIVE HIM NEGATIVE
01500		TDC	A,HYPRBT(SHIP)			;SET-UP FOR HYPER TEST
01600		TDCE	A,HYPRBT(SHIP)			;IS HE HYPER SPACING?
01700		GO	JS1				;NO
01800		DZM	SRX(SHIP)			;DON'T LET HIM ROTATE BOTH WAYS
01900		SKIPN	HYPON
02000		GO	JS1				;HYPERSPACE OFF
02100	IFN HYPERS,<					;ORIGINAL HYPERSPACE?
02200		DAC	C,HYPER(SHIP)			;SET HIS HYPER TIME
02300	>
02400	IFN NHYP,<					;NEW HYPERSPACE?
02500		PUSHJ	P,SETHYP			;SET UP FOR HYPERSPACE
02600	>
02700	JS1:	SOJGE	SHIP,BITLOP			;LOOP FOR EVERY SHIP
02800		POPJ	P,				;ALL DONE
     

00100		SUBTTL	INSERT LOSER INTO NEW HYPERSPACE
00200	IFN NHYP,<
00300	SETHYP:	LAC	C,RCONST
00400		ADDB	C,RANDX
00500		DAC	C,SP(SHIP)
00600		HLRE	B,C			;GET -2Y
00700		HRRE	C,C			;GET 2X
00800		FSC	B,223			;FLOAT IT
00900		FSC	C,223			;FLOAT Y
01000		DAC	C,SX(SHIP)		;SAVE X
01100		MOVNM	B,SY(SHIP)		;SAVE Y
01200		DZM	SV(SHIP)		;NO VELOCITY FOR SHIP
01300		DZM	SVX(SHIP)
01400		DZM	SVY(SHIP)
01500		LAC	C,RANDX			;GET RANDOM NUMBER
01600		LAC	B,C			;IN BOTH
01700		ANDI	B,177			;GIVE HIM A RANDOM ORIENTATION
01800		DAC	B,SR(SHIP)		;...
01900		ADDI	B,100			;MAKE SURE HE STAYS OUT A WHILE
02000		DAC	B,HYPER(SHIP)		;SAVE TIME TO SPEND THERE
02100		LSH	C,-5			;TAKE A RANDOM FIELD
02200		ANDI	C,3			;AND WITH 7
02300		AOS	B,HYPCNT(SHIP)		;INCREMENT HIS TIMES IN H SPACE
02400		CAMGE	C,B			;SKIP IF HE WILL SURVIVE
02500		SETOM	HYPCNT(SHIP)		;HE SHALL LOSE
02600		POPJ	P,			;HE WINS THIS TIME
02700	>
     

00100		SUBTTL	CODE FOR RUNTIME PARAMETER MODIFICATION
00200	IFG PARM,<
00300		SDEF(DIGF,1)
00400		SDEF(LETF,2)
00500		SDEF(NEGF,4)
00600		SDEF(CNGF,10)
00700		SDEF(PNTF,20)
00800	LPARM:	0				;CELL TO REMEMBER WHERE
00900	RPARM:	SETO	A,			;GET OUR LINE CHARACTERISTICS
01000		TTCALL	6,A			;INTO A
01100		TLO	A,100			;SET SPECIAL ACTIVATION MODE
01200		TTCALL	7,A			;TTY WILL WAKE ON WORD BY WORD
01300		TTCALL	14,			;WAIT FOR A WORD TO COME IN
01400		SETO	A,			;FOR OUR LINE
01500		TTCALL	6,A			;GET LINE CHARACTERISTICS
01600		TLZ	A,100			;SHUT OFF SPECIAL BIT
01700		TTCALL	7,A			;RESET LINE MODE
01800		PUSHJ	P,GETNAM		;GET THE NAME OF A CELL
01900		CAIE	A,"/"			;/ IS THE ACTIVATOR
02000		GO	QWERT			;LOSE
02100		CAIE	B,45			;CODE FOR .?
02200		GO	RPARM0			;NOPE
02300		SKIPN	D,LPARM
02400		GO	QWERT
02500		GO	RPARM2			;WE HAVE IT
02600	RPARM0:	CAMN	B,[RADIX50 0,LIST]	;COMMAND TO LIST?
02700		GO	RPARML			;YE
02800		CAMN	B,[RADIX50 0,CLEAR]	;CLEAR SCREEN?
02900		GO	RPMC			;YES
03000		MOVEI	D,PTAB			;GET ADDRESS OF TABLE
03100	RPARM1:	LAC	C,(D)			;GET SYMBOL CELL FROM TABLE
03200		TLZ	C,740000		;SHUT OFF CODE BITS
03300		CAMN	B,C			;MATCH?
03400		GO	RPARM2			;YES!
03500		ADDI	D,2			;PRESS AHEAD
03600		CAIGE	D,PTABX			;END OF TABLE?
03700		GO	RPARM1			;NO. LOOP.
03800	QWERT:	TTCALL	11,0			;I DON'T UNDERSTAND
03900		TTCALL	3,[ASCIZ/?
04000	/]
04100		POPJ	P,			;GIVE UP
04200	RPARM2:	CAR	A,1(D)			;LOAD ADDRESS OF PARAMETER
04300		DAC	D,LPARM			;REMEMBER .
04400		LAC	A,(A)			;GET WHOLE PARAMETER
04500		LDB	B,[POINT 3,0(D),3]	;GET CODE BITS
04600		TTCALL	3,[ASCIZ/	/]	;WRITE TAB
04700		CAR	C,IOTAB(B)
04800		PUSHJ	P,(C)
04900		TTCALL	3,[ASCIZ/	/]	;AND A TAB
05000		CDR	C,IOTAB(B)
05100		PUSHJ	P,(C)
05200		GO	QWERT
05300		TRNN	F,CNGF
05400		POPJ	P,			;NO CHANGE
05500		CDR	B,1(D)
05600		JUMPE	B,RPARM4		;READY TO STUFF
05700		LAC	C,(D)
05800		TLNE	C,400000
05900		GO	RPARM3			;TEST FOR LOWER BOUND
06000		CAML	B,W
06100		GO	RPARM4
06200	RPARMX:	TTCALL	3,[ASCIZ/OUT OF BOUNDS
06300	/]
06400		POPJ	P,
06500	RPARM3:	CAMLE	B,W
06600		GO	RPARMX
06700	RPARM4:	CAR	C,1(D)
06800		DAC	W,(C)
06900		POPJ	P,
07000	RPARML:	MOVEI	D,PTAB
07100		TTCALL	3,[ASCIZ/
07200	/]
07300	RPML1:	LAC	W,(D)			;GET RADIX 50
07400		TLZ	W,740000
07500		PUSHJ	P,R5OUT			;WRITE RADIX50
07600		LDB	B,[POINT 3,0(D),3]	;GET BITS
07700		TTCALL	3,[ASCIZ/	/]
07800		CAR	A,1(D)
07900		LAC	A,(A)
08000		CAR	C,IOTAB(B)
08100		PUSHJ	P,(C)
08200		TTCALL	3,[ASCIZ/
08300	/]
08400		ADDI	D,2
08500		CAIGE	D,PTABX
08600		GO	RPML1
08700		POPJ	P,
08800	R5OUT:	IDIVI	W,50
08900		HRLM	X,(P)
09000		JUMPE	W,.+2
09100		PUSHJ	P,R5OUT
09200		CDR	W,(P)
09300		JUMPG	W,R5OUT1
09400		TTCALL	3,[ASCIZ/ /]
09500		POPJ	P,
09600	R5OUT1:	CAILE	W,12
09700		GO	R5OUT2
09800		ADDI	W,"0"-1
09900		TTCALL	1,W
10000		POPJ	P,
10100	R5OUT2:	CAILE	W,44
10200		GO	R5OUT3
10300		ADDI	W,"A"-13
10400		TTCALL	1,W
10500		POPJ	P,
10600	R5OUT3:	SUBI	W,2
10700		CAIN	A,43
10800		MOVEI	W,"."
10900		TTCALL	1,W
11000		POPJ	P,
11100	RPMC:	TTCALL	3,[BYTE(7)15,14,14,14]
11200		POPJ	P,
     

00100	GETNAM:	ZAC	B,			;ZERO B. WE ACCUMULATE RADIX 50
00200	GETNM1:	PUSHJ	P,GETLET		;GET A LETTER AND SKIP
00300		POPJ	P,			;B WILL CONTAIN THE NAME. A HAS BREAK
00400		PUSHJ	P,R50			;A IS CONVERTED TO RADIX 50
00500		IMULI	B,50			;MAKING RADIX 50
00600		ADD	B,A			;ADD IN CHARACTER
00700		GO	GETNM1			;LOOP
00800	GETCHR:	TTCALL	0,A			;GET A CHARACTER
00900		TRZ	F,LETF+DIGF		;ZERO FLAGS
01000		CAIL	A,"a"			;SKIP IF NOT LOWER CASE
01100		CAILE	A,"z"			;SKIP IF LOWER CASE
01200		GO	GETCH1			;LOOK FOR MORE
01300		TRZ	A,40			;MAKE UPPER CASE
01400		GO	GETCH2			;GO TURN ON LETF AND RETURN
01500	GETCH1:	CAIL	A,"A"			;SKIP IF NOT LETTER
01600		CAILE	A,"Z"			;SKIP IF LETTER
01700		GO	GETCH3			;TEST FOR DIGITS
01800	GETCH2:	TRO	F,LETF			;TURN ON FLAG
01900		POPJ	P,			;RETURN
02000	GETCH3:	CAIL	A,"0"			;SKIP IF NOT DIGIT
02100		CAILE	A,"9"			;SKIP IF DIGIT
02200		GO	GETCH4			;NOT DIGIT
02300		TRO	F,DIGF			;SET FLAG
02400		POPJ	P,			;RETURN
02500	GETCH4:	CAIN	A,15			;IS IT CR?
02600		GO	GETCHR			;YES. GET NEXT
02700		CAIN	A,175			;TEST FOR ALTMODE
02800		MOVEI	A,12			;CONVERT TO LF
02900		POPJ	P,			;RETURN
03000	GETLET:	PUSHJ	P,GETCHR		;GET A LETTER. FIRST GET CHARACTER
03100		TRNE	F,LETF+DIGF		;ANY FLAGS SET?
03200		GO	CPOPJ1			;YES: DO A SKIP RETURN
03300		CAIE	A,"$"
03400		CAIN	A,"%"
03500		GO	CPOPJ1
03600		CAIN	A,"."
03700	CPOPJ1:	AOS	(P)
03800		POPJ	P,
03900	R50:	TRNE	F,LETF			;IS THIS A LETTER
04000		SUBI	A,"A"-13		;CONVERT TO R 50
04100		TRNE	F,DIGF			;IS IT A DIGIT
04200		SUBI	A,"0"-1
04300		TRNE	F,LETF+DIGF
04400		POPJ	P,
04500		ADDI	A,2
04600		CAIN	A,"."+2
04700		MOVEI	A,45
04800		POPJ	P,
04900	DECOUT:	LAC	W,A			;GET ARGUMENT
05000		MOVEI	Y,12			;GET RADIX
05100		GO	ALLRAD			;DO FOR ALL RADIX
05200	OCTOUT:	LAC	W,A			;GET ARGUMENT
05300		MOVEI	Y,10			;SET RADIX
05400		GO	ALLRAD			;DO ALL
05500	OHOUT:	CDR	W,A			;GET FIRST HALF
05600		MOVEI	Y,10			;SET RADIX
05700		PUSHJ	P,ALLRAD		;DO FIRST HALF
05800		TTCALL	3,[ASCIZ/,,/]		;WRITE SEPARATION
05900		CAR	W,A			;GET OTHER SIDE
06000	ALLRAD:	JUMPGE	W,ARADIX
06100		TTCALL	3,[ASCIZ/-/]
06200		MOVN	W,W
06300	ARADIX:	IDIV	W,Y
06400		HRLM	X,(P)
06500		JUMPE	W,.+2
06600		PUSHJ	P,ARADIX
06700		CDR	W,(P)
06800		ADDI	W,"0"
06900		TTCALL	1,W
07000		POPJ	P,
07100	FLOUT:	JUMPN	A,FLOUT1		;JUMP UNLESS ARGUMENT IS 0
07200		TTCALL	3,[ASCIZ/0.0/]
07300		POPJ	P,
07400	FLOUT1:	MOVM	W,A			;GET |ARG| INTO W
07500		JUMPG	A,FLOUT2		;JUMP PAST KLUGE IF ARG POSITIVE
07600		TTCALL	3,[ASCIZ/-/]
07700	FLOUT2:	ZAC	Y,		;POSITION OF THE POINT
07800	FLOUT3:	CAML	W,[1.0]		;LESS THAN 1.0
07900		GO	FLOUT4		;NO
08000		FMPR	W,[10.0]	;MULTIPLY BY 10.0
08100		SOJA	Y,FLOUT3	;COUNT THE POINT SHIFT
08200	FLOUT4:	CAMGE	W,[10.0]	;COMPARE TO 10.0
08300		GO	FLOUT5		;WE ARE SCALED
08400		FDVR	W,[10.0]	;SCALE DOWN
08500		AOJA	Y,FLOUT3	;COUNT AND LOOP
08600	FLOUT5:	CAML	Y,[-2]		;ARE WE IN BOUNDS?
08700		CAILE	Y,6		;IN BOUNDS?
08800		GO	FLOUTE		;NO: WRITE IN EXPONENT FORM
08900		AOJG	Y,FLOUTX	;PREPARE FOR BIG NUMBER
09000		TTCALL	3,[ASCIZ/0./]	;WRITE BEGINNING OF NUMBER
09100		JUMPE	Y,FLOUTX	;JUMP IF NO MORE 0'S
09200		TTCALL	3,[ASCIZ/0/]	;WRITE PLACE HOLDER ZEROES
09300		AOJL	Y,.-1		;LOOP
09400	FLOUTX:	FMPR	W,[1000000.0]	;MULTIPLY BY BIG NUMBER
09500		MULI	W,400		;SPLIT EXPONENT/FRACTION
09600		ASH	X,-243(W)	;FIX THE NUMBER
09700		LAC	W,X		;LOAD IT INTO W
09800	FDOUT:	IDIVI	W,12
09900		HRLM	X,(P)
10000		JUMPE	W,.+2
10100		PUSHJ	P,FDOUT
10200		CDR	W,(P)
10300		ADDI	W,"0"
10400		TTCALL	1,W
10500		SOJN	Y,CPOPJ
10600		TTCALL	3,[ASCII/./]
10700		POPJ	P,
10800	FLOUTE:	PUSH	P,Y		;SAVE FRACTION COUNT
10900		MOVEI	Y,1		;MAKE POINT COME AFTER 1 DIGIT
11000		PUSHJ	P,FLOUTX	;CALL OTHER STUFF
11100		TTCALL	3,[ASCII/'/]	;WRITE FOR EXPONENT
11200		POP	P,A		;RECOVER THE FRACTION COUNT
11300		GO	DECOUT		;WRITE DECIMAL AND RETURN
11400	
11500	RADIN:	SETZB	W,X			;NUMBER IN W. -POINT COUNT IN X
11600		TRZ	F,CNGF+NEGF+PNTF	;ZERO FLAGS
11700	RADIN1:	PUSHJ	P,GETCHR
11800		TRNN	F,DIGF
11900		GO	RADIN2			;NOT DIGIT
12000		CAIL	A,"0"(Y)		;IS LEGAL
12100		POPJ	P,			;ILLEGAL DIGIT
12200		IMUL	W,Y
12300		ADDI	W,-"0"(A)
12400		TRNE	F,PNTF			;POINT SEEN YET?
12500		SUBI	X,1			;YES: COUNT IN X
12600		TRO	F,CNGF			;MARK ATTEMPT TO CHANGE
12700		GO	RADIN1			;LOOP
12800	RADIN2:	CAIE	A,"."			;DECIMAL POINT
12900		GO	RADIN3			;NOPE
13000		TROE	F,PNTF			;TURN ON POINT
13100		POPJ	P,			;IT WAS SET BEFORE
13200		GO	RADIN1			;LOOP
13300	RADIN3:	CAIE	A,"-"			;IS IT THE SIGN?
13400		GO	RADIN4
13500		TRNN	F,CNGF+PNTF		;ANYTHING SEEN YET?
13600		TROE	F,NEGF			;TURN ON FLAG
13700		POPJ	P,			;LOSE
13800		GO	RADIN1			;WIN
13900	RADIN4:	TRZE	F,NEGF	
14000		MOVN	W,W			;NEGATE
14100		GO	CPOPJ1			;SKIP RETURN TO WIN!
14200	
14300	OCTIN:	MOVEI	Y,10
14400		GO	INRAD
14500	DECIN:	MOVEI	Y,12
14600	INRAD:	PUSHJ	P,RADIN
14700		POPJ	P,			;LOSER
14800		CAIN	A,12			;MUST SEE LF
14900		JUMPE	X,CPOPJ1		;AND NO DIGITS PAST POINT
15000		POPJ	P,			;LOSE
15100	FLIRT:	MOVEI	Y,12			;SET RADIX
15200		PUSHJ	P,RADIN	
15300		POPJ	P,
15400		CAIE	A,"'"
15500		GO	FLIRT1			;NO EXPONENT
15600		PUSH	P,W			;SAVE STUFF
15700		PUSH	P,X
15800		PUSHJ	P,DECIN
15900		GO	FLIRTL			;LOSSAGE FROM FLIRT
16000		POP	P,X			;GET OLD POINT COUNT
16100		ADD	X,W			;MAKE REAL EXPONENT
16200		POP	P,W			;GET DIGITS PART
16300	FLIRT1:	CAIE	A,12			;END OF LINE?
16400		POPJ	P,			;NOPE. LOSE
16500		FSC	W,233
16600		JUMPE	X,CPOPJ1		;IF NO EXPONENT
16700		LAC	Y,[10.0]
16800		JUMPG	X,FLIRT2
16900		LAC	Y,[0.1]
17000		MOVM	X,X
17100	FLIRT2:	FMPR	W,Y
17200		SOJG	X,.-1
17300		GO	CPOPJ1
17400	FLIRTL:	POP	P,(P)
17500		POP	P,(P)
17600		POPJ	P,
17700	OHIN:	MOVEI	Y,10
17800		PUSHJ	P,RADIN
17900		POPJ	P,
18000		JUMPN	X,CPOPJ
18100		CAIN	A,12
18200		GO	CPOPJ1
18300		CAIE	A,","
18400		POPJ	P,
18500		TTCALL	0,A
18600		CAIE	A,","
18700		POPJ	P,
18800		LAC	C,W
18900		PUSHJ	P,OCTIN
19000		POPJ	P,
19100		HRL	W,C
19200		GO	CPOPJ1
     

00100		SUBTTL	TABLES FOR THE PARAMETER MODIFICATION
00200	COMMENT/
00300	ENTRIES ARE:
00400		RADIX50 N,SYMBOL
00500		BOUND,,ADDRESS
00600	WHERE N HAS THE FOLLOWING SIGNIFIGANCE
00700		IF N≥40 THEN THE BOUND IS A LOWER BOUND. TAKE N MOD 40 FOR
00800		N=0 	FLOATING POINT
00900		N=4	OCTAL
01000		N=10	DECIMAL
01100		N=14	OCTAL HALF WORDS
01200	
01300		IF BOUND = 0 THEN THERE IS NO RESTRICTION
01400	/
01500	PTAB:	RADIX50	0,BTX
01600		XWD	0,BTX
01700		RADIX50	0,GDT
01800		XWD	0,GDT
01900		RADIX50	0,BRX
02000		XWD	0,BRX
02100		RADIX50	0,GG
02200		XWD	0,GG
02300		RADIX50	0,MTCOLR
02400		XWD	0,MTCOLR
02500		RADIX50	0,TR2
02600		XWD	0,TR2
02700		RADIX50	0,SCR
02800		XWD	0,SCR
02900		RADIX50	4,NTORPS
03000		XWD	NTORPM,NTORPS
03100		RADIX50	4,TTBMAX
03200		XWD	LTBL,TTBMAX
03300		RADIX50	4,LATNCY
03400		XWD	0,LATNCY
03500		RADIX50	4,TLIFE
03600		XWD	200,TLIFE
03700		RADIX50	14,ITV
03800		XWD	0,ITV
03900		RADIX50	44,TRELOD
04000		XWD	20,TRELOD
04100		RADIX50	4,RSTARD
04200		XWD	0,RSTARD
04300	IFG HYPERS,<
04400		RADIX50	4,HYTIME
04500		XWD	0,HYTIME
04600		RADIX50	4,HYPEN
04700		XWD	0,HYPEN
04800	>
04900		RADIX50	4,DOTEAM
05000		XWD	0,DOTEAM
05100		RADIX50	10,SURBEN
05200		XWD	0,SURBEN
05300		RADIX50	10,KILLBN		;KILLER'S BENEFIT, WAGES OF SIN
05400		XWD	0,KILLBN
05500		RADIX50	10,DIEPEN		;PENALTY FOR DYING
05600		XWD	0,DIEPEN
05700		RADIX50	10,GSCORE		;SET TO DISPLAY GALAXY SCORE
05800		XWD	0,GSCORE
05900	SDEF(PTABX,.-1)				;DEFINE END OF TABLE
06000	IOTAB:	XWD	FLIRT,FLOUT
06100		XWD	OCTIN,OCTOUT
06200		XWD	DECIN,DECOUT
06300		XWD	OHIN,OHOUT
06400		SDEF(UPDLEN,30)			;USER PUSHDOWN LENGTH
06500	UPDL:	IOWD	UPDLEN,UPDLST
06600	UPDLST:	BLOCK	UPDLEN
06700	>					;END OF IFG PARM
     

00100		SUBTTL	DATA STORAGE FOR SPACEWAR
00200	TENDON:	0			;SET -1 BY PDP-10 WHEN DONE.
00300					;TESTED BY PDP-6. ZEROED WHEN PDP-6 RUNS
00400	SIXDON:	0			;SET -1 WHEN PDP-6 FINISHES. 
00500					;TESTED AND CLEARED BY PDP-10
00600	CTIME:	CTMX
00700		4
00800	CTMX:	0
00900	CTIM1:	0			;SAVE DPY SELECT WORD HERE
01000		LVW(0,0,i,a,7,7)	;SELECT CENTER, BIG BRIGHT
01100	CTIM:	0
01200	CDOWN:	0
01300	DMASK:	0				;DAMAGE MASK
01400	SAVSID:	0				;USED BY DAMAGE ASSESSMENT
01500	DEBUG:	0				;SET ≠0 TO FAKE SPACEWAR
01600	SWBUT:	0				;SAVE OLD SW BUTTONS HERE
01700	NSHIPX:	NSHIP-1				;NUMBER OF SHIPS-1 TO USE
01800	DDSW:	0				;SET ≠ 0 FOR NEW BUTTONS
01900	TUBES:	0				;SET ≠0 FOR TWO TUBES
02000	DAMHIT:	0				;SET ≠0 FOR PARTIAL DAMAGE
02100	RSPSWT:	0				;SET ≠0 FOR RANDOM STARTS
02200	KILSUN:	-1				;SET =0 FOR NON-KILLER SUN
02300	CNTR:	0				;SET ≠ 0 FOR SCORES
02400	HYPON:	0				;SET ≠ 0 TO USE ALLOW HYPERSPACE
02500	KILLER:	0				;SET ≠ 0 FOR KILLER SCORES
02600	TENSW:	0				;SET ≠0 FOR SW ON THE 10
02700	SIXSW:	0				;0 means PDP-6 is running.
02800	RCONST:	532473734251			;A RANDOM CONSTANT
02900	RANDX:	352716643514			;A RANDOM NUMBER
03000	RAND:	717271471534			;YET ANOTHER RANDOM NUMBER
03100	DISTAB:
03200	STARFG:	0				;SET -1 TO DISPLAY STARS
03300	SHIPFG:	0				;SET -1 TO DISPLAY SHIPS
03400	CNTFG:	0				;SET -1 TO DISPLAY COUNTS
03500	STADR:	SUN				;ADDRESS OF STAR TABLE
03600		NSTAR+STARBF-SUN		;LENGTH OF STAR TABLE
03700	BPTRX:	BUF				;ADDRESS OF DPY BUFFER
03800		0				;CLOBBER THIS TO BUFFER LENGTH
03900	CNTPNT:	CNTTBL				;ADDRESS OF COUNT TABLE
04000		1+2*NSHIP			;SIZE OF COUNT TABLE
04100	BITS:	0				;KBD BITS
04200	OLINE:	0
04300	LINE:	0				;DPY LINE NUMBER
04400	GSCORE:	0				;SET ≠ 0 FOR GALAXY SCORE
04500	MINSTR:	0				;>0⊃ TIME BEFORE RELAYING MINES
04600	PDP:	IOWD	PDLEN,PDLIST		;THE PUSH DOWN POINTER
04700	TAB:	BLOCK	200			;TABLE OF SINES AND COSINES
04800	CLOBR:	0				;SET ≠ 0 AFTER HI CORE IS CLOBBERED
04900	PDLIST:	BLOCK	PDLEN			;STORAGE FOR PUSH DOWN LIST
05000	CNTTBL:	BLOCK	3+2*NSHIP		;TABLE TO DISPLAY SCORES WITH
05100	TV:	BLOCK	LTBL			;TORPEDO VELOCITY -2Y,,2X
05200	TP:	BLOCK	LTBL			;TORPEDO POSITION -2Y,,2X
05300	TL:	BLOCK	LTBL			;TORPEDO REMAINING LIFE
05400	TVX:	BLOCK	LTBL			;TORPEDO X VELOCITY (FLOATING POINT)
05500	TVY:	BLOCK	LTBL			;TORPEDO Y VELOCITY (FLOATING POINT)
05600	NUMWN:	BLOCK	NSHIP			;WINS FOR EACH PLAYER
05700	SDEF(GOBEG,.)				;AREA TO ZERO AT GAME BEGINNING
05800	TPNT:	0				;ACTIVE TORP COUNT
05900	QRSTRT:	0				;<0 ⊃ TIME BEFORE RESTART
06000	ZOWSW:	BLOCK	NSHIP			;NON ZERO DENOTING EXPLOSION
06100	HYPER:	BLOCK	NSHIP			;POSITIVE ⊃ IN HYPERSPACE
06200	TCNT0:	BLOCK	NSHIP			;RELOAD DELAY: SHIP n TUBE 0
06300	TCNT1:	BLOCK	NSHIP			;RELOAD DELAY: SHIP n TUBE 1
06400	UTUBE:	BLOCK	NSHIP			;TUBE SELECT TOGGLE
06500	ZORCHP:	BLOCK	NSHIP			;SHIP'S ZORCH PROGRESS
06600	TPCN:	BLOCK	NSHIP			;REMAINING TORPEDO COUNT
06700	STEMP:	BLOCK	NSHIP			;NOSE POSITIONS
06800	SRA:	BLOCK	NSHIP			;LEFTSIDE BITS=ORIENTATION
06900	RESTAR:	BLOCK	NSHIP			;FOR AUTO RESTART COUNTS
07000	HYPCNT:	BLOCK	NSHIP			;# OF TIMES IN H-SPACE. &
07100						;RANDOM NUMBER DURING ZORCH
07200	SR:	BLOCK	NSHIP			;BASIC ORIENTATION (ROT) 0-177
07300	SV:	BLOCK	NSHIP			;BASIC VELOCITY -2Y,,2X
07400	MINEV:	BLOCK	NMINE
07500	SP:	BLOCK	NSHIP			;BASIC POSITION -2Y,,2X
07600	MINEP:	BLOCK	NMINE
07700	SX:	BLOCK	NSHIP			;X POSITION FLOATING
07800	MINEX:	BLOCK	NMINE
07900	SY:	BLOCK	NSHIP			;Y POSITION (FLOATING)
08000	MINEY:	BLOCK	NMINE
08100	SVX:	BLOCK	NSHIP			;X VELOCITY (FLOATING)
08200	MINEVX:	BLOCK	NMINE
08300	SVY:	BLOCK	NSHIP			;Y VELOCITY (FLOATING)
08400	MINEVY:	BLOCK	NMINE
08500	SDEF(GOEND,.-1)				;END OF STUFF ZEROED BY GAME
08600	SDEF(JSTB,.)				;ZERO BEFORE READING BUTTONS
08700	STX:	BLOCK	NSHIP			;THRUST INCREMENT FOR SHIPS
08800	SRX:	BLOCK	NSHIP			;DELTA OMEGA (ROTATION)
08900	SDEF(JSTBX,.-1)				;END OF STUFF ZEROED BY JS
09000	IFN FAST,<
09100	BTX:	1.6				;THRUST
09200	BRX:	2.0				;ANGULAR VELOCITY OF ROTATION
09300	GG:	32.0				;GRAVITATIONAL CONSTANT
09400	HYTIME:	100				;TIME TO SPEND IN HYPERSPACE
09500	HYPEN:	100				;HYPERSPACE RELOAD PENALTY
09600	ITV:	3400000				;TORP VELOCITY
09700	TRELOD: 60				;NORMAL RELOAD TIME
09800	>
09900	IFE FAST,<				;SLOW DEFAULTS
10000	BTX:	0.8				;THRUST
10100	BRX:	1.0				;ROTATIONAL D OMEGA/DT
10200	GG:	16.0				;GRAV CONSTANT
10300	HYTIME:	200				;HYPERSPACE-1 DURATION
10400	HYPEN:	40				;HYPERSPACE-1 PENALTY
10500	ITV:	1600000				;INITIAL TORPEDO VELOCITY
10600	TRELOD:	30				;TUBE RELOAD DELAY
10700	>
10800	RSTARD:	400				;RESTART DELAY
10900	MTCOLR:	100.0
11000	TR2:	36.0				;TORPEDO RADIUS ↑ 2
11100	DOTEAM:	0				;SET ≠ 0 IF USING TEAM SCORING
11200	SURBEN:	1				;SURVIVAL BENEFIT
11300	DIEPEN:	0				;PENALTY FOR DYING: DEATH PENALTY
11400	KILLBN:	0				;REWARD FOR KILLING, WAGES OF SIN
11500	GALAXY:	0				;SCORE FOR OVERHEAD
11600	GDT:	6.0				;DELTA T FOR INTEGRATION
11700	SCR:	10.0				;SUN COLISION RADIUS
11800	NTORPS:	NTORPM				;NUMBER OF TORPS/PLAYER
11900	NMINEX:	NMINE				;MAXIMUM NUMBER OF MINES ≤ NMINE
12000	TTBMAX:	LTBL				;MAXIMUM TORPS IN TABLE ≤ LTBL
12100	LATNCY:	10				;MIN TIME BETWEEN SHOTS (TUBES)
12200	TLIFE:	200				;TORPEDO LIFE
12300	RDELAY:	XWD	SHIP,TCNT0		;@RDELAY(X) WILL GET/SET RELOAD
12400		XWD	SHIP,TCNT1		;DELAY FOR SHIP'S TUBE (X).
12500	STTB1:	NMINEX				;NUMBER OF OBJECTS FOR STCOL (MINES)
12600		TPNT				;DITTO, TORPEDOES
12700	STTB2:	XWD	R11,MINEP		;STCOL: OBJECT POSITION TABLE ADDRESS
12800		XWD	R11,TP			;TORPEDOES, (LAST LINE WAS MINES)
12900	STTB3:	XWD	R11,MINEP		;ZERO THIS TO CANCEL OBJECT (MINE)
13000		XWD	R11,TL			;CANCEL TORPEDO
13100	TFTAB:	10				;FLAME LOCATOR FOR SHIPS
13200		12				;FLAME POSITION = 
13300		13				;SP(SHIP)-TAB(SR(SHIP))*TFTAB(SHIP)
13400		14
13500		14
13600	SPTAB:	14				;DIDDLE TO GET SHIP NOSE
13700		14				;SHIP NOSE POSITION =
13800		14				;SP(SHIP)+TAB(SR(SHIP))*SPTAB(SHIP)
13900		14
14000		14
14100	SPICT:	S1TAB				;TABLE OF PICTURE ADDRESSES
14200		S2TAB
14300		S3TAB				;ARE ASSEMBLED
14400		S4TAB
14500		S5TAB
14600	TPBIT:	1				;BIT SIGNIFYING TORP LAUNCH
14700		20
14800		400
14900		10000
15000		200000
15100	ALLBIT:	17				;BUTTON BITS FOR EACH SHIP
15200		360
15300		7400
15400		170000
15500		3600000
15600	THRUBT:	2
15700		40
15800		1000
15900		20000
16000		400000
16100	ROTRBT:	4
16200		100
16300		2000
16400		40000
16500		1000000
16600	ROTLBT:	10
16700		200
16800		4000
16900		100000
17000		2000000
17100	HYPRBT:	14
17200		300
17300		6000
17400		140000
17500		3000000
17600	IPOS:	BLOCK	NSHIP		;INITIAL POSITIONS
17700	IROT:	BLOCK	NSHIP
17800	COUNTP:	BLOCK	NSHIP
17900	GLOC:	LVW(10,10,i,a,5,5)
18000	S1TAB:	XWD	-4,70			;SHIP  1 PICTURE
18100		XWD	-21,100
18200		XWD	-4,60
18300		XWD	-6,0
18400		XWD	-4,160
18500		XWD	-3,140
18600		XWD	-4,120
18700		XWD	-6,100
18800		XWD	-4,20
18900		XWD	-3,40
19000		XWD	-3,140
19100		XWD	-20,0
19200		XWD	-4,10
19300		0
19400	S2TAB:	XWD	-4,70
19500		XWD	-23,100
19600		XWD	-3,30
19700		XWD	-6,0
19800		XWD	-3,150
19900		XWD	-3,140
20000		XWD	-3,130
20100		XWD	-6,100
20200		XWD	-3,50
20300		XWD	-3,40
20400		XWD	-3,140
20500		XWD	-22,0
20600		XWD	-4,10
20700	ZERO:	0
20800	S3TAB:	XWD	-4,70
20900		XWD	-23,100
21000		XWD	-3,40
21100		XWD	-6,0
21200		XWD	-4,152
21300		XWD	-2,140
21400		XWD	-4,126
21500		XWD	-6,100
21600		XWD	-6,40
21700		XWD	-3,140
21800		XWD	-23,0
21900		XWD	-4,10
22000		0
22100	S4TAB:	XWD	-4,70
22200		XWD	-23,100
22300		XWD	-4,40
22400		XWD	-10,165
22500		XWD	-4,140
22600		XWD	-10,112
22700		XWD	-7,40
22800		XWD	-3,140
22900		XWD	-23,0
23000		XWD	-4,12
23100		0
23200	S5TAB:	XWD	-4,70
23300		XWD	-23,100
23400		XWD	-2,60
23500		XWD	-4,20
23600		XWD	-6,160
23700		XWD	-4,140
23800		XWD	-6,120
23900		XWD	-4,60
24000		XWD	-2,20
24100		XWD	-4,40
24200		XWD	-3,140
24300		XWD	-23,0
24400		XWD	-4,12
24500		0
24600		LIT
24700	SUN:	0
24800	SELWRD:	1
24900		lvw(-12,-10,i,a,7,2)		;CENTER FOR THE SUN
25000		<ASCIZ	/⊗/>+1			;THE SUN ITSELF
25100	STARBF:
25200	BUF:	BLOCK	BUFLEN			;THE BUFFER FOR THE WORLD
     

00100		SUBTTL	ONCE ONLY SET PARAMETERS AT STARTUP
00200	SETALL:	TTCALL	3,[ASCIZ/WELCOME TO SPACEWAR.
00300	HOW MANY SHIPS? MAXIMUM IS /]
00400		MOVEI	A,NSHIP
00500		PUSHJ	P,%DEC
00600		TTCALL	3,[ASCIZ/	/]
00700		PUSHJ	P,%DIGIN
00800		SOJGE	A,.+2
00900		MOVEI	A,1		;TWO SHIPS IF CR
01000		CAIL	A,NSHIP
01100		MOVEI	A,NSHIP-1
01200		DAC	A,NSHIPX
01300		CAILE	A,1
01400		GO	%SDD
01500	TTCALL	3,[ASCIZ/KEYBOARD BUTTONS? (ELSE REGULAR). TYPE Y OR N: /]
01600		PUSHJ	P,%YN
01700		TDZA	A,A
01800	%SDD:	MOVEI	A,1
01900		DAC	A,DDSW				;SAVE DDSW
02000		LAC	A,NSHIPX
02100		CAILE	A,1				;1 OR 2 PERSON GAME?
02200		GO	%STD1				;NO ASK ABOUT STANDARD FOR >2
02300		TTCALL	3,[ASCIZ/THE "STANDARD" GAME IS:
02400	1 CONSOLE, 2 TORPEDO TUBES, (NORMAL) SCORING,
02500	NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN.
02600	SHIPS START IN STANDARD POSITIONS.
02700	TYPE Y TO GET A STANDARD GAME: /]
02800		PUSHJ	P,%YN
02900		GO	%SELPM
03000		GO	%STG2				;STANDARD FOR 2.
03100	%STD1:	TTCALL	3,[ASCIZ/THE "STANDARD" GAME IS:
03200	1 CONSOLE, 2 TORPEDO TUBES, KILLER SCORING,
03300	NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN.
03400	SHIPS START IN STANDARD POSITIONS.
03500	TYPE Y TO GET A STANDARD GAME: /]
03600		PUSHJ	P,%YN
03700		GO	%SELPM				;SELECT PARAMETERS.
03800		MOVEI	A,1
03900		SETOM	KILLER
04000		DAC	A,KILLBN
04100		DAC	A,DIEPEN
04200	%STG2:	MOVEI	A,1
04300		DAC	A,TUBES
04400		DZM	DAMHIT
04500		DZM	DOTEAM
04600		DZM	HYPON
04700		DZM	OLINE
04800		DZM	RSPSWT
04900		DAC	A,SELWRD
05000		MOVEI	A,NMINE
05100		DAC	A,NMINEX
05200		SETOM	CNTR
05300		GO	%GO
05400	%SELPM:	TTCALL	3,[ASCIZ/SECOND CONSOLE? NUMBER ELSE RETURN: /]
05500		PUSHJ	P,%DIGIN
05600		JUMPE	A,%NOTHR		;NO OTHER
05700		SUBI	A,24			;RESET TO REASONABLENESS
05800		JUMPL	A,%NOTHR
05900		CAILE	A,5
06000		GO	%NOTHR
06100	;	CALCULATE SELECT BIT FOR DPYOUT
06200		MOVN	B,A
06300		MOVSI	C,400000
06400		LSH	C,(B)
06500		TRO	C,10			;MAKE IT A SELECT
06600		DAC	C,SELWRD		;SAVE SELECTOR WORD
06700		TRO	A,100
06800		DAC	A,OLINE			;SAVE AS THE OTHER LINE NUMBER
06900		GO	%NOTHX
07000	%NOTHR:	DZM	OLINE
07100		MOVEI	A,1
07200		DAC	A,SELWRD
07300	%NOTHX:
07400	IFG NMINE,<
07500		MOVEI	A,NMINE
07600		TTCALL	3,[ASCIZ/HOW MANY SPACE-MINES DO YOU WANT?
07700	CHOOSE FROM 0 TO /]
07800		PUSHJ	P,%DEC
07900		TTCALL	3,[ASCIZ/  /]
08000		PUSHJ	P,%DIGIN
08100		CAILE	A,NMINE
08200		MOVEI	A,NMINE
08300		DAC	A,NMINEX
08400	>
08500		TTCALL	3,[ASCIZ/PARTIAL DAMAGE? /]
08600		PUSHJ	P,%YN
08700		TDZA	A,A
08800		MOVEI	A,1
08900		DAC	A,DAMHIT
09000		TTCALL	3,[ASCIZ/DISPLAY SCORES? /]
09100		PUSHJ	P,%YN
09200		TDZA	A,A
09300		MOVEI	A,1
09400		DAC	A,CNTR
09500		TTCALL	3,[ASCIZ/TWO TORPEDO TUBES? /]
09600		PUSHJ	P,%YN
09700		TDZA	A,A
09800		MOVEI	A,1
09900		DAC	A,TUBES
10000		SKIPN	CNTR
10100		GO	%NK
10200		LAC	A,NSHIPX
10300		CAIE	A,3
10400		GO	%NTS
10500		TTCALL	3,[ASCIZ/TEAM SCORES? /]
10600		PUSHJ	P,%YN
10700	%NTS:	TDZA	A,A
10800		MOVEI	A,1
10900		DAC	A,DOTEAM
11000		TTCALL	3,[ASCIZ/KILLER SCORE? /]
11100		PUSHJ	P,%YN
11200		GO	%NK
11300		SETOM	KILLER
11400		MOVEI	A,1
11500		DAC	A,KILLBN
11600		DAC	A,DIEPEN
11700	%NK:	DZM	HYPON
11800	IFN HYPERS+NHYP,<
11900		TTCALL	3,[ASCIZ/HYPERSPACE? /]
12000		PUSHJ	P,%YN
12100		TDZA	A,A
12200		MOVEI	A,1
12300		DAC	A,HYPON
12400	>
12500		TTCALL	3,[ASCIZ /"RANDOM" STARTING POSITIONS?/]
12600		PUSHJ	P,%YN
12700		TDZA	A,A
12800		MOVEI	A,1
12900		DAC	A,RSPSWT
13000	%GO:	LAC	A,NSHIPX
13100		LAC	B,%CDIR(A)
13200		LAC	C,%IPOS(A)
13300		LAC	D,%IROT(A)
13400		ZAC	W,
13500	%IL:	LAC	X,0(B)
13600		DAC	X,COUNTP(W)
13700		LAC	X,0(C)
13800		DAC	X,IPOS(W)
13900		LAC	X,0(D)
14000		DAC	X,IROT(W)
14100		ADDI	B,1
14200		ADDI	C,1
14300		ADDI	D,1
14400		ADDI	W,1
14500		SOJGE	A,%IL
14600		GO	%XIT
     

00100		SUBTTL	MORE ONCE ONLY
00200	%XIT:	SKIPE	JOBDDT
00300		POPJ	P,
00400		MOVEI	A,SETALL-1
00500		CORE	A,			;CUT BACK THE CORE
00600		JFCL
00700		SETOM	CLOBR
00800		POPJ	P,			;RETURN
00900	%YN:	TTCALL	4,A
01000		TTCALL	11,
01100		CAIE	A,"Y"
01200		CAIN	A,"y"
01300		AOS	(P)
01400		POPJ	P,
01500	%DEC:	IDIVI	A,12
01600		HRLM	B,(P)
01700		SKIPE	A
01800		PUSHJ	P,%DEC
01900		CDR	A,(P)
02000		ADDI	A,"0"
02100		TTCALL	1,A
02200		POPJ	P,
02300	%DIGIN:	ZAC	A,
02400	%DIG1:	TTCALL	4,B
02500		CAIL	B,"0"
02600		CAILE	B,"9"
02700		GO	%DIG2
02800		IMULI	A,12
02900		ADDI	A,-"0"(B)
03000		GO	%DIG1
03100	%DIG2:	TTCALL	11,
03200		POPJ	P,
     

00100		SUBTTL	CONSTANTS
00200	%CDIR:	%CP124
00300		%CP124
00400		%CP3
00500		%CP124
00600		%CP5
00700	%IPOS:	%IP124
00800		%IP124
00900		%IP3
01000		%IP124
01100		%IP5
01200	%IROT:	%IRT12
01300		%IRT12
01400		%IRT3
01500		%IRT4
01600		%IRT5
01700	%IP124:	XWD	-200000,200000
01800		XWD	200000,-200000
01900		XWD	-200000,-200000
02000		XWD	200000,200000
02100	%IP3:	XWD	-240000,0	;SHIP 1 AT TOP CENTER
02200		XWD	 110000,220000	;SHIP 2 AT 4 OCLOCK
02300		XWD	 110000,-220000	;SHIP 3 AT 8 OCLOCK
02400	%IP5:	XWD	-240000,0
02500		XWD	-50000,230000
02600		XWD	200000,140000
02700		XWD	200000,-140000
02800		XWD	-50000,-230000
02900	%IRT4:	120		;POINT TO THE SUN
03000		20
03100		60
03200		160
03300	%IRT12:	100
03400		0
03500	%IRT3:	100
03600		153
03700		25
03800	%IRT5:	100
03900		131
04000		163
04100		14
04200		46
04300	%CP124:	LVW(640,640,i,a,5,5)
04400		LVW(-700,-700,i,a,5,5)
04500		LVW(-700,640,i,a,5,5)
04600		LVW(640,-700,i,a,5,5)
04700	%CP3:	LVW(-40,640,i,a,5,5)
04800		LVW(640,-700,i,a,5,5)
04900		LVW(-700,-700,i,a,5,5)
05000	%CP5:	LVW(-40,640,i,a,5,5)
05100		LVW(640,300,i,a,5,5)
05200		LVW(500,-700,i,a,5,5)
05300		LVW(-540,-700,i,a,5,5)
05400		LVW(-700,300,i,a,5,5)
05500		END	STRT			;FINALLY, THE END